自动配置原理

上一章的 DemoApplication 没有写任何装配代码,Tomcat、Spring MVC 却都自动就绪,靠的是自动配置(Auto-configuration)。本章拆解 @SpringBootApplication 与条件装配机制,并学会排查「为什么没生效」。

@SpringBootApplication 是什么

它是一个组合注解,核心由三部分组成:

  • @SpringBootConfiguration:标识这是一个配置类(其内部是 @Configuration);
  • @EnableAutoConfiguration:开启自动配置,是自动装配的开关;
  • @ComponentScan:默认扫描主类所在包及其子包,所以业务组件应放在启动类同包或子包下,否则扫描不到。

自动配置的工作流程

  1. 引入 starter 后,类路径(classpath)上出现对应的类;
  2. spring-boot-autoconfigure 里有一批以 @AutoConfiguration 标注的配置类,其清单登记在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中;
  3. 每个自动配置类内部用条件注解判断当前环境是否满足要求,满足才装配 Bean;
  4. 若开发者已经自己声明了同名 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 报告,而不是盲目改代码。

笔记加载中…