返回顶部

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 文件。虽然为了向后兼容,两者都会被读取,

核心方法

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应用程序时才加载配置类。
posted @   zhangfff  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示