自动配置原理
上一章的 DemoApplication 没有写任何装配代码,Tomcat、Spring MVC 却都自动就绪,靠的是自动配置(Auto-configuration)。本章拆解 @SpringBootApplication 与条件装配机制,并学会排查「为什么没生效」。
@SpringBootApplication 是什么
它是一个组合注解,核心由三部分组成:
@SpringBootConfiguration:标识这是一个配置类(其内部是@Configuration);@EnableAutoConfiguration:开启自动配置,是自动装配的开关;@ComponentScan:默认扫描主类所在包及其子包,所以业务组件应放在启动类同包或子包下,否则扫描不到。
自动配置的工作流程
- 引入 starter 后,类路径(classpath)上出现对应的类;
spring-boot-autoconfigure里有一批以@AutoConfiguration标注的配置类,其清单登记在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中;- 每个自动配置类内部用条件注解判断当前环境是否满足要求,满足才装配 Bean;
- 若开发者已经自己声明了同名 Bean,自动配置会「让位」(back off),保证用户配置优先。
条件装配:条件注解
常用条件注解(都在 org.springframework.boot.autoconfigure.condition 包下):
| 注解 | 生效条件 |
|---|---|
| @ConditionalOnClass | 类路径上存在指定类 |
| @ConditionalOnMissingBean | 容器中不存在指定 Bean |
| @ConditionalOnProperty | 指定配置项满足值要求 |
| @ConditionalOnWebApplication | 是 Web 应用(Servlet/响应式) |
| @ConditionalOnSingleCandidate | 指定类型只有一个候选 Bean |
典型例子:引入 spring-boot-starter-web 且类路径存在 Servlet 与 Tomcat 相关类,自动配置才装配内嵌 Tomcat 与 DispatcherServlet;没引入数据源依赖时,DataSource 相关配置因条件不满足而整体跳过。
观察与开关
- 启动时加
--debug(或配置debug=true),控制台会打印自动配置报告:Positive matches(生效项)与Negative matches(未生效项及原因),排查问题先看这里。 - 关闭某一项自动配置:
@SpringBootApplication(exclude = XxxAutoConfiguration.class),或全局配置spring.autoconfigure.exclude。 - 生产环境可配合 actuator 的
conditions端点在线查看。
自定义自动配置(简介)
写组件库时才需要自定义:用 @AutoConfiguration 标注配置类,并把它登记进 AutoConfiguration.imports 文件(该文件的格式与加载顺序以官方文档为准)。普通业务应用内部一般不需要。
小结
自动配置 = 候选清单 + 条件装配 + 让位机制。理解它之后,遇到「配置没生效」就知道去读 Positive/Negative 报告,而不是盲目改代码。