Spring Boot 自动配置原理
1. 引入 @EnableAutoConfiguration
在 Spring Boot 应用程序的主配置类(通常是带有 @SpringBootApplication 注解的类)中,通常会引入 @EnableAutoConfiguration 注解,该注解负责启动自动配置功能。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. 解析 @Import 注解
当 Spring 容器启动时,会解析 @Import 注解,并加载相应的配置。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
3. DeferredImportSelector
在通过 @Import 导入的配置类中,可能包含一个 DeferredImportSelector。
作用:
- 确保 Spring Boot 的自动配置类在最后加载。
- 便于扩展和覆盖已有的配置。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return getAutoConfigurationEntry(annotationMetadata).getConfigurations();
}
}
4. 读取 META-INF/spring.factories 文件
Spring Boot 通过 SPI(Service Provider Interface)机制,读取类路径下的 META-INF/spring.factories 文件,该文件包含了各种自动配置类的配置。
示例:spring.factories 文件内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.ClassA,\
com.example.autoconfigure.ClassB
5. 过滤出 AutoConfigurationClass类
从 spring.factories 文件中,Spring Boot 会过滤出所有 AutoConfigurationClass 类型的类,这些类包含了自动配置的具体实现。
6. 条件化加载
最后,Spring Boot 会根据条件(@ConditionalXXX 注解)来排除或包含特定的自动配置类。这些条件会根据应用程序的环境和配置动态生效。
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
总结
Spring Boot 的自动配置原理是通过 @EnableAutoConfiguration 注解引入自动配置逻辑,然后解析 @Import 注解,加载各种配置类,包括 DeferredImportSelector 和自动配置类。通过 SPI 机制读取 spring.factories 文件,过滤出自动配置类,并根据条件化配置来动态加载这些类,从而实现自动配置的功能。
这种机制使得 Spring Boot 应用程序可以根据环境和需求自动配置,极大地简化了开发和部署的工作。









网友评论