当前位置: 首页 > news >正文

SpringBoot配置优先级、bean管理

SpringBoot配置优先级

虽然SpringBoot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置(yml是主流)

SpringBoot项目进行打包时,需要引入插件spring-boot-plugin(基于官网创建项目,会自动添加该插件)

bean管理

bean作用域

面试题1:Spring容器的bean是单例的还是多例的?单例的bean是什么时候实例化的?

  • 默认作用域:Spring容器中的bean默认是单例(singleton)的,即整个容器中只创建一个实例,所有依赖该bean的地方都共享这个实例。但Spring也支持其他作用域,如原型(prototype,每次获取都创建新实例)、请求(request,每个HTTP请求一个实例)、会话(session,每个HTTP会话一个实例)等,可以通过@Scope注解或XML配置指定。

  • 单例bean的实例化时机

    • ApplicationContext(常用容器)中,默认情况下,单例bean在容器启动时(即refresh()过程中)就会被实例化,这称为预实例化(pre-instantiation)。这样做可以及早发现配置错误,并提高第一次获取bean的速度。

    • 如果不想让单例bean在容器启动时立即实例化,可以通过设置@Lazy注解或XML中的lazy-init="true",将其改为延迟加载(lazy-initialization),这样bean会在第一次被获取时才实例化。

    • 在更底层的BeanFactory中,默认行为是延迟加载,即只有在第一次调用getBean()时才会实例化单例bean。

因此,单例bean的实例化时机取决于容器的类型以及是否配置了延迟加载。


面试题2:Spring容器的bean是线程安全的吗?

Spring容器本身并不保证bean的线程安全性,线程安全问题取决于bean的实现方式。

  • 无状态bean:如果bean没有可变的成员变量(或者所有成员变量都是只读的,比如注入的其他服务、常量),那么它是线程安全的。例如常见的Controller、Service、DAO通常设计为无状态,可以被多个线程安全地共享。Spring默认将这些bean设为单例正是利用了无状态的特点。

  • 有状态bean:如果bean包含可变的实例变量(例如计数器、用户会话信息等),则可能出现线程安全问题,因为多个线程同时修改共享状态会导致数据不一致。此时需要开发者自行处理线程安全,常见做法包括:

    • 使用ThreadLocal将变量与线程绑定。

    • 采用同步机制(如synchronizedLock),但可能影响性能。

    • 将bean的作用域改为非单例,如prototyperequestsession,让每个线程或每个请求拥有独立的实例,从而避免共享。

此外,Spring MVC中的Controller默认也是单例的,如果Controller内部使用了有线程安全问题的对象(例如SimpleDateFormat,它非线程安全),则需要特别注意,通常建议将这类对象定义为局部变量或使用ThreadLocal包装。

总结:Spring不保证bean的线程安全,开发者需根据bean的状态和作用域自行确保线程安全。而无状态的单例bean天生就是线程安全的,也是Spring推荐的设计方式。

第三方bean

http://www.jsqmd.com/news/437326/

相关文章:

  • Vue2项目实战:TinyMCE富文本编辑器从安装到文件上传完整指南
  • 零基础玩转轻量AI:HY-1.8B-2Bit-GGUF开箱即用,低显存设备福音
  • PROJECT MOGFACE在嵌入式AI的桥梁作用:为STM32F103C8T6提供云端智能
  • Vivado仿真报错VRFC 10-3032?三步搞定IP核依赖问题(附截图)
  • UE4动画系统避坑指南:Play Montage节点Stop All Montages的隐藏陷阱
  • Qwen3-ASR-1.7B GPU算力方案:单台服务器部署5个实例的资源隔离实践
  • Qwen-Image-2512-Pixel-Art-LoRA部署教程:适配CUDA 12.4 + PyTorch 2.5.0生产环境
  • Layui图片预览功能升级:鼠标滚轮缩放+旋转按钮实战教程
  • ESP32-S3硬件设计核心原则与工程实践
  • 自动驾驶避障新方案:基于ISAC的MIMO-OFDM雷达通信联合系统避坑指南
  • Gitea分支权限管理实战:如何让普通开发者远离main分支(附详细配置截图)
  • Python实战:目标检测中IOU计算的三种高效实现方法
  • Qwen3-ForcedAligner-0.6B多语言支持深度解析:11种语言时间戳预测
  • Granite TimeSeries FlowState R1 时间序列预测模型全面解读:9.1M轻量级,零样本快速上手
  • 零样本预测实战:无需微调,用Granite FlowState R1快速验证时间序列流程
  • STM32+ESP-01S AT指令自动化集成实战
  • MedGemma医学影像助手惊艳表现:支持‘用表格形式总结关键发现’格式指令
  • Windows10下Qt5.15.2与VTK-8.2.0的完美联姻:MINGW编译避坑全记录
  • 论文党必备:Mathtype公式完美兼容Markdown的隐藏技巧
  • 如何通过API获取京东商品的券后价格详情
  • Simulink HDL实战:5步搞定NCO与FIR Filter联合设计(附FPGA验证技巧)
  • SQL 入门 4:多表连接与联合:外连接到 UNION 的应用
  • 从零实现Microfacet材质:在Games101作业7中还原真实金属质感(含Bunny模型缩放秘籍)
  • OLED显示工程化设计:SSD1306驱动与语义化UI架构
  • 从零到一:基于PICO4与Unity 3D的VR应用快速构建与打包指南
  • 排队免单:9个月8000店的商业密码
  • 嵌入式基础外设速通:GPIO/PWM/ADC/IRQ/TIMER/UART/USB/多核工程实践
  • 【大模型从零开始】小规模 Transformer 训练的最佳实践一览
  • Webtrees开源家谱系统:从安装到协作的全流程指南
  • 深海稀土火了!日本挖到不少却难量产,中国已悄悄突破