SpringBoot自动化配置原理
SpringBoot自动化配置原理
核心注解
@SpringBootApplication 注解:这个注解是Spring Boot应用程序的入口,它实际上是一个组合注解,包含了@Configuration、@EnableAutoConfiguration 和 @ComponentScan。
- @SpringBootConfiguration,底层是Configuration,表示启动类也是一个配置类
- @ComponentScan注解,组件扫描,默认会扫描启动类包及子包下Spring能够识别的注解
- @EnableAutoConfiguration 是Spring Boot中的一个核心注解,用于启用自动配置功能
- @EnableAutoConfiguration 的内部实现:
- 使用 @Import 注解:
@EnableAutoConfiguration 注解内部使用了 @Import(AutoConfigurationImportSelector.class) 注解。这意味着当 @EnableAutoConfiguration 被应用时,AutoConfigurationImportSelector 类会被导入并执行。 - AutoConfigurationImportSelector 类:
AutoConfigurationImportSelector 实现了 ImportSelector 接口,其主要职责是选择需要导入的自动配置类。 - selectImports 方法是 AutoConfigurationImportSelector 的核心方法,它负责根据条件选择并返回需要加载的自动配置类的全限定名列表。
- 2.7以前的版本读取 spring.factories 文件:
AutoConfigurationImportSelector 会在类路径下的 META-INF/spring.factories 文件中查找 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键对应的值。这些值通常是自动配置类的全限定名。 - META-INF/spring/AutoConfiguration.imports 文件是Spring Boot 2.7 及以后版本引入的一个新机制,用于进一步简化和优化自动配置类的加载过程。这个文件的引入是为了替代或补充 META-INF/spring.factories 文件,特别是在处理大量自动配置类时,可以提高性能和可维护性。
- 2.7以后的版本读取 spring.factories 文件:
AutoConfigurationImportSelector 会在类路径下的 META-INF/spring.factories文件中查找 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键对应的值。
读取 AutoConfiguration.imports 文件:
AutoConfigurationImportSelector 也会读取类路径下的 META-INF/spring/AutoConfiguration.imports 文件,每行包含一个自动配置类的全限定名。
合并配置类:
将从 spring.factories 文件和 AutoConfiguration.imports 文件中读取的自动配置类合并成一个列表。 - 注意:在 Spring Boot 2.7+ 中,spring.factories 中的 EnableAutoConfiguration 键已被弃用,推荐使用 META-INF/spring/AutoConfiguration.imports 文件。虽然为了向后兼容,两者都会被读取,
- 2.7以前的版本读取 spring.factories 文件:
核心方法
SpringApplication.run()
- 使用 AutoConfigurationImportSelector 读取 META-INF/spring.factories 和 META-INF/spring/AutoConfiguration.imports 文件中的自动配置类。
- 根据条件化注解(如 @ConditionalOnClass、@ConditionalOnMissingBean 等)选择需要加载的自动配置类。
- 加载并注册选中的自动配置类。
条件化注解
条件化注解是Spring Boot自动配置的核心机制之一,用于根据不同的条件决定是否加载某个配置类。常见的条件化注解包括:
- @ConditionalOnClass:仅当指定的类存在于类路径中时才加载配置类。
- @ConditionalOnMissingClass:仅当指定的类不存在于类路径中时才加载配置类。
- @ConditionalOnBean:仅当Spring容器中存在指定的Bean时才加载配置类。
- @ConditionalOnMissingBean:仅当Spring容器中不存在指定的Bean时才加载配置类。
- @ConditionalOnProperty:仅当指定的属性存在且满足条件时才加载配置类。
- @ConditionalOnWebApplication:仅当应用程序是Web应用程序时才加载配置类。
- @ConditionalOnNotWebApplication:仅当应用程序不是Web应用程序时才加载配置类。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具