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

SpringBoot 自动装配流程

Spring Boot 的自动装配(Auto Configuration)是其最核心的特性之一,它让你能“开箱即用”,极大简化了配置。下面是 Spring Boot 自动装配的整体流程(从启动到生效) 的详细解析:

✅ 一、整体流程概览

@SpringBootApplication↓
@EnableAutoConfiguration↓
@Import(AutoConfigurationImportSelector)↓
读取 META-INF/spring.factories 或 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports↓
筛选出符合条件的配置类(@Conditional 系列注解)↓
通过 IOC 容器进行配置类的实例化(@Bean 等生效)

✅ 二、核心注解与机制

1. @SpringBootApplication

这是一个复合注解,相当于:

@Configuration
@EnableAutoConfiguration
@ComponentScan

重点是其中的 @EnableAutoConfiguration

2. @EnableAutoConfiguration

这个注解的作用是:启用 Spring Boot 的自动配置功能
它的关键点是使用了:

@Import(AutoConfigurationImportSelector.class)

3. AutoConfigurationImportSelector

这是自动装配的“入口类”。它做的事包括:

  • 从类路径下 META-INF/spring.factories(Spring Boot 2.x) 或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x) 中读取所有自动配置类;
  • 然后筛选出条件满足的类(使用 @Conditional 相关注解);
  • 最终将这些配置类注入 Spring 容器中。

✅ 三、自动装配背后的几个关键文件

1. META-INF/spring.factories(Spring Boot 2)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.ClassA,\
com.example.autoconfig.ClassB

2. Spring Boot 3 使用 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

这是 Spring Boot 3.x 引入的新方式(为提高性能和模块粒度)。

✅ 四、常见的条件注解(决定是否装配)

注解含义
@ConditionalOnClass某个类存在时才装配
@ConditionalOnMissingBeanSpring 容器中没有某个 bean 时才装配
@ConditionalOnProperty配置文件中有指定属性或值时才装配
@ConditionalOnBean有某个 Bean 存在时才装配
@ConditionalOnWebApplication是 Web 环境才装配

这些注解让自动装配具备条件性和灵活性,防止误装配。

✅ 五、自动装配类里一般做了什么?

  • 标注为 @Configuration
  • 声明 @Bean 方法;
  • 使用条件注解控制 bean 是否创建;
  • 利用 @Conditional 注解动态判断配置是否注入;
  • 读取 application.properties 中的配置,通过 @ConfigurationProperties 自动绑定。

✅ 六、如何排查和定制自动装配

  • 排查某个类是否被自动装配:使用 spring-boot-actuator 提供的 /actuator/conditions
  • 定制自动装配:可以写自己的自动配置类,注册到 spring.factories
  • 排除默认装配:使用 @SpringBootApplication(exclude = XxxAutoConfiguration.class)

✅ 七、总结一句话:

Spring Boot 自动装配通过 @EnableAutoConfiguration,配合 AutoConfigurationImportSelector 动态加载并实例化一批配置类,它们通常带有条件注解,控制是否向容器中注入默认的 Bean。

相关文章:

  • 培训考试系统在职业技能培训中发挥着怎么样的作用
  • c++作业整理2
  • java中XML的使用
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能药柜管理系统技术方案
  • 阿里云的网络有哪些
  • 【药品进销存专用软件】佳易王药品台账管理系统:门诊进销存怎么操作?系统实操教程 #医药系统进销存
  • OptiStruct实例:汽车声控建模
  • OpenCV计算机视觉实战(5)——图像基础操作全解析
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月15日第78弹
  • 多光谱影像:解锁遥感奥秘的 “彩色钥匙”
  • python中使用neo4j
  • 在C++模板中,设置一个无名模板参数的默认值为0到底是什么含义
  • 人工智能(AI)与机器学习(ML):定义、区别及应用解析
  • 互联网大厂Java求职面试:AI与大模型集成的云原生架构设计
  • 流程编辑器Bpmn与LogicFlow学习
  • C40-指针
  • nn.Module 与 nn.functional
  • Hashmap 和 map的区别
  • 单片机开发软件
  • mysql数据库-3 (主从复制)
  • 自强!助残!全国200个集体和260名个人受到表彰
  • 车主质疑零跑汽车撞车后AEB未触发、气囊未弹出,4S店:其把油门当刹车
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 终于越过萨巴伦卡这座高山,郑钦文感谢自己的耐心和专注
  • 汕头违建豪宅“英之园”将强拆,当地:将根据公告期内具体情况采取下一步措施
  • 【社论】公平有序竞争,外卖行业才能多赢