Spring Boot自动装配基于@EnableAutoConfiguration触发,依赖Starter引入、spring.factories定位配置类、@Conditional条件判断三环节,非“工厂注入”。

Spring Boot 的自动装配不是靠“工厂注入”驱动的,而是基于 @EnableAutoConfiguration 触发的一套标准化配置加载机制。所谓“工厂注入”,容易和 Spring 中的 FactoryBean 或 BeanFactory 混淆,但它并不是自动装配的核心路径。真正的起点是依赖引入 + 条件化配置 + 容器注册。
自动装配真正依赖的三个关键环节
它不靠手动写工厂类,也不靠在代码里 new 出来再塞进容器,而是一套约定驱动的流程:
-
Starter 依赖触发:比如引入
spring-boot-starter-web,就等于告诉 Spring Boot:“我需要 Web 能力”,它会自动拉取 Tomcat、Spring MVC 相关 jar,并附带一个预定义好的自动配置类(如WebMvcAutoConfiguration) -
spring.factories 文件定位配置类:每个 starter 的 jar 包里都有
META-INF/spring.factories,里面用org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.WebMvcAutoConfiguration,xxx.HttpMessageConvertersAutoConfiguration列出所有可启用的配置类 -
@Conditional 系列注解控制生效条件:每个自动配置类都包裹着
@ConditionalOnClass、@ConditionalOnMissingBean等判断逻辑。例如只有 classpath 里存在DispatcherServlet类,且容器中还没有用户自定义的DispatcherServletBean 时,才会真正注册默认的 Servlet 实例
容器启动时如何“开启”自动配置
入口在启动类上的 @SpringBootApplication 注解,它本质是三个注解的组合:
-
@SpringBootConfiguration:标识这是一个配置类(等价于@Configuration) -
@ComponentScan:扫描当前包及子包下的@Component、@Service等组件 -
@EnableAutoConfiguration:这才是自动配置的开关——它通过@Import(AutoConfigurationImportSelector.class)导入所有符合条件的自动配置类
也就是说,只要项目里有 @SpringBootApplication,又引入了任意 starter,Spring Boot 就会在刷新容器前,把 spring.factories 里声明的、且满足条件的配置类全部加载进来,完成 Bean 的声明与注册。
为什么不是“工厂注入依赖”?
“工厂注入”听起来像在写 FactoryBean 或调用 BeanFactory.registerSingleton() 这类底层 API,但 Spring Boot 自动装配全程不暴露这些细节:
- 你不需要实现
FactoryBean接口去封装对象创建逻辑 - 你不用主动调用容器的注册方法,所有 Bean 都由
@Configuration类里的@Bean方法或条件注解隐式控制 - 真正起作用的是
AutoConfigurationImportSelector——它读取spring.factories,筛选类,再批量导入,整个过程对开发者透明
想干预自动配置?靠排除,不靠覆盖工厂
如果某个自动配置你不想要,标准做法是:
- 在
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})中排除 - 或在
application.yml中写:spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
而不是去重写工厂类或修改容器初始化流程——那已脱离 Spring Boot 的设计范式。

















