Skip to content

Spring Boot 自动装配

是什么

Spring Boot 让业务模块无需写任何 @Bean 即可获得第三方 starter 提供的能力,这套机制叫「自动装配」。框架开发者负责声明「哪些 @Configuration 在用户应用启动时自动生效」。

三个关键 API

API / 文件用途
@AutoConfiguration标记一个 @Configuration 为自动装配类(Spring Boot 2.7+ 引入,替代 @Configuration 直接挂在 spring.factories)
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports自动装配类的注册清单,一行一个全限定类名(Spring Boot 2.7+ 取代 META-INF/spring.factories
AutoConfigurationPackages在自动装配生效时由 @AutoConfigurationPackage(含在 @SpringBootApplication 里)记录的“基础包列表”,常用于「让 starter 知道用户的扫描根包」

不再使用 spring.factories

Spring Boot 3.x 已彻底废弃 META-INF/spring.factories 作为自动装配入口,必须使用新的 AutoConfiguration.imports。本项目基于 Spring Boot 3.5.4,所以走的就是新方式。

怎么用

1. 写自动装配类

java
@AutoConfiguration
@ComponentScan(basePackageClasses = MyAutoConfiguration.class)
public class MyAutoConfiguration {
    // 可在此声明 @Bean,也可让 @ComponentScan 把同包下的 @Component 装配进来
}

2. 注册到 imports 文件

文件路径:src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

com.example.MyAutoConfiguration

3. 读用户的基础包(可选)

java
List<String> packages = AutoConfigurationPackages.get(beanFactory);
// 通常返回用户 @SpringBootApplication 所在包,例如 ["com.user.app"]

只要用户的启动类用了 @SpringBootApplication(内含 @AutoConfigurationPackage),Spring Boot 就会注册该启动类所在包为「基础包」。第三方 starter 可以直接消费它,省得让用户再配一遍 scanBasePackages

本框架怎么用

forge-ddl 模块的入口非常薄:

java
// DdlAutoConfiguration.java
@AutoConfiguration
@ComponentScan(basePackageClasses = DdlAutoConfiguration.class)
public class DdlAutoConfiguration {
}
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
cn.cvking.forge.ddl.DdlAutoConfiguration

业务模块的 pom.xml 引入 forge-ddl 依赖后,Spring Boot 启动时:

  1. 扫描 classpath 下所有 AutoConfiguration.imports 文件
  2. DdlAutoConfiguration 注册为配置类
  3. @ComponentScanClazzScanner / ModelRegistry / DdlInitializer 三个 @Component 注册为 Bean
  4. DdlInitializer 在容器装配完成后被 callRunners() 触发,调用 AutoConfigurationPackages.get(beanFactory) 拿到用户启动类所在包,作为扫描根

整个过程业务方无须写任何配置。

→ 详细见 《整体架构》