Spring Boot自动装配是通过@SpringBootApplication触发、基于spring.factories和AutoConfigurationImportSelector实现的条件化Bean注册机制。它先发现配置类,再按@Conditional规则筛选并注册Bean,依赖starter提供资源与配置定义,全程注解驱动、可追溯、非黑箱。

Spring Boot自动装配不是黑箱,它是一套有迹可循、层层递进的机制。核心就两点:让该加载的配置类被发现,再让该生效的Bean被注册。整个过程从启动类的@SpringBootApplication开始,到IOC容器里真正跑起来,全程靠注解驱动 + 配置文件 + 条件化加载完成。
@SpringBootApplication 是个“组合拳”
这个注解本身不干活,但它把三件事打包在一起:
-
@SpringBootConfiguration:本质是
@Configuration,告诉Spring“我是一个配置类”,可以定义@Bean - @EnableAutoConfiguration:真正的自动装配开关,背后触发整个自动配置流程
-
@ComponentScan:默认扫描启动类所在包及其子包,加载
@Service、@Controller等组件
自动装配靠的是 spring.factories + AutoConfigurationImportSelector
启动时,@EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)引入一个关键选择器。它会做三件事:
- 读取所有
META-INF/spring.factories文件(包括你引入的starter、Spring Boot自身、甚至第三方starter里的) - 从中提取
org.springframework.boot.autoconfigure.EnableAutoConfiguration键对应的全限定类名列表 - 过滤掉被
@ConditionalOnClass、@ConditionalOnMissingBean等条件注解拦下的配置类——没依赖不加载,已有Bean不覆盖
比如spring-boot-starter-web的spring.factories里写了:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
这些类只有在classpath有DispatcherServlet时才真正加载。
配置类怎么变成Bean?走的是标准ConfigurationClass解析流程
筛选后的自动配置类(如WebMvcAutoConfiguration)会被当成普通@Configuration类处理。Spring内部用ConfigurationClassParser解析它们,步骤如下:
- 扫描
@Bean方法,生成BeanDefinition - 处理
@Import、@ImportResource、@ComponentScan等导入逻辑 - 遇到
@Conditional系列注解,运行条件判断——失败则跳过该@Bean或整个配置类 - 最终把所有通过校验的
BeanDefinition注册进BeanFactory
注意:自动配置类本身也会被注册为Bean(因为加了@Configuration),但它的主要价值是作为“工厂”,产出其他Bean。
起步依赖(Starter)和自动装配是搭档关系
没有starter,自动装配就“无米下锅”:
- 每个
spring-boot-starter-xxx都包含两部分:依赖描述(pom.xml)+ 自动配置定义(spring.factories) - 比如引入
spring-boot-starter-data-redis,不仅拉入lettuce-core、spring-data-redis,还会在自己的spring.factories里声明RedisAutoConfiguration - 只要你没排除(
exclude = RedisAutoConfiguration.class),且classpath有Redis相关类,它就会被选中并注册RedisTemplate、LettuceConnectionFactory等Bean
换句话说:starter负责“带资源进门”,自动装配负责“进门后安排岗位”。
基本上就这些。不复杂,但容易忽略细节——比如@ConditionalOnClass检查的是类是否存在,不是是否被使用;spring.factories支持多模块叠加;自定义starter也得按这个套路来写。理解了这条链路,debug自动配置失效、排查Bean缺失,就都有方向了。










