自动装配是 Spring Boot 简化配置的核心机制,其核心思想是根据类路径中的依赖自动配置 Spring 应用。
启动注解 @SpringBootApplication
该注解组合了 @EnableAutoConfiguration
,用于激活自动配置。
加载自动配置类
AutoConfigurationImportSelector
类会扫描所有 JAR 包中的 META-INF/spring.factories
文件。org.springframework.boot.autoconfigure.EnableAutoConfiguration
列出了所有自动配置类的全限定名。条件化加载配置类
自动配置类使用条件注解(如 @ConditionalOnClass
、@ConditionalOnMissingBean
)决定是否生效。例如:
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
public class DataSourceAutoConfiguration {
// 当类路径存在 DataSource 时,自动配置数据源
}
自动注册 Bean
满足条件的配置类会向 Spring 容器注册 Bean,无需手动编写 XML 或 Java 配置。
spring.factories
文件:定义自动配置类的清单。SpringFactoriesLoader
:Spring 提供的 SPI 实现,用于加载配置类。SPI 是一种服务发现机制,允许第三方为接口提供实现,实现解耦。Java 原生 SPI 和 Spring 的 SPI 类似但实现方式不同。
java.sql.Driver
接口。META-INF/services/
下创建以接口全限定名命名的文件,内容为实现类名:com.mysql.cj.jdbc.Driver
ServiceLoader
加载实现类ServiceLoader<Driver> drivers = ServiceLoader.load(Driver.class);
缺点:无法按需加载、不支持条件化配置。
Spring 扩展了 SPI 机制,通过 META-INF/spring.factories
文件实现更灵活的扩展。
spring.factories
中指定键值对,例如:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
SpringFactoriesLoader
加载SpringFactoriesLoader.loadFactoryNames()
加载配置类。优势:支持批量加载、结合条件注解实现动态装配。
特性 | Java SPI | Spring SPI |
---|---|---|
配置文件位置 | META-INF/services/ |
META-INF/spring.factories |
加载方式 | ServiceLoader |
SpringFactoriesLoader |
条件化支持 | 不支持 | 支持(结合条件注解) |
典型应用场景 | JDBC 驱动加载 | Spring Boot 自动装配 |
spring.factories
的 SPI 机制,动态加载配置类,减少手动配置。