Spring Boot 自动设置

打印 上一主题 下一主题

主题 1521|帖子 1521|积分 4563

目录
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
一、自动装配的核心机制
二、源码分析流程
2.1 起点:@SpringBootApplication
2.2 @EnableAutoConfiguration 的作用
2.3  AutoConfigurationImportSelector 源码分析
2.4 自动设置类加载过程
2.5 自动设置类的条件过滤 
条件注解过滤逻辑
三、自动装配完整流程


@SpringBootApplication

@SpringBootApplication 是 Spring Boot 应用的核心入口注解,它通过组合多个关键注解简化了SpringBoot应用的设置。
   

  • @SpringBootConfiguration

    • 作用:标识当前类是一个 Spring Boot 的设置类
    • 源码:本质上是 @Configuration 的别名
    • 功能:等价于@Configuration ,表示该类中可能界说 @Bean 方法

  • @EnableAutoConfiguration

    • 启用 Spring Boot 的自动装配机制。
    • 本章内容重点讨论这个注解

  • @ComponentScan

    • 自动扫描并注册当前包及其子包下的组件(如 @Component, @Service, @Controller)。
    • 若未指定 basePackages,则扫描主类所在的包及其子包。

  
Spring Boot的自动装配(Auto-Configuration)是其核心特性之一。
它通过约定大于设置的方式,自动加载符合条件的Bean到Spring容器中

一、自动装配的核心机制

   自动装配基于以下核心组件实现:
  

  • @EnableAutoConfiguration 注解

    • 触发自动装配的入口。

  

  

  •    
    spring.factories 文件(Spring Boot 2.x)或 AutoConfiguration.improts(Spring Boot 3.x)

    • 界说自动设置类的列表

  

  

  •    
    @ConditionalOnXXX(eg. @ConditionalOnClass)

    • 决定是否加载某个设置

  

  二、源码分析流程

2.1 起点:@SpringBootApplication

   Spring Boot应用的启动类通常标注 @SpringBootApplication,该注解是一个组合注解:
  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration  // 关键注解,触发自动装配
  3. @ComponentScan
  4. public @interface SpringBootApplication {}
复制代码

2.2 @EnableAutoConfiguration 的作用

   @EnableAutoConfiguration 通过 @Import 引入了 AutoConfigurationImportSelector类:
  

  
2.3  AutoConfigurationImportSelector 源码分析

注:这里以Spring Boot 3.1.2版本为例,
上面说到了 3.xx版本会读取 AutoConfiguration.imports 文件,2.xx 版本会读取 spring.factories 文件
   

  • AutoConfigurationImportSelector 负责加载全部自动装配类:
  

   
  关键方法 getAutoConfigurationEntry
  

  • 从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x+)或 spring.factories(Spring Boot 2.x)加载设置类列表。
  • 过滤掉不满足条件的设置类(基于条件注解)。
  • 2.xx版本:SpringFactoriesLoader.loadSpringFactories() 方法负责加载设置类
  

   

  
2.4 自动设置类加载过程

以 Spring Boot 3.x 为例,自动设置类界说在文件中:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容示例:


2.5 自动设置类的条件过滤 

   自动设置类通常包含条件注解,例如 DataSourceAutoConfiguration:
  1. @AutoConfiguration
  2. @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) // 类路径存在时才生效
  3. @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")  // 容器中不存在指定 Bean 时生效
  4. @EnableConfigurationProperties(DataSourceProperties.class)
  5. public class DataSourceAutoConfiguration {
  6.     // 自动创建 DataSource Bean
  7.     @Bean
  8.     @ConditionalOnMissingBean(DataSource.class)
  9.     public DataSource dataSource(...) { ... }
  10. }
复制代码
条件注解过滤逻辑

  OnClassCondition@ConditionalOnClass 的实际执行类
  1. public class OnClassCondition extends FilteringSpringBootCondition {
  2.     @Override
  3.     protected ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata metadata) {
  4.         // 检查类路径是否存在指定类
  5.         for (String autoConfigurationClass : autoConfigurationClasses) {
  6.             String onClass = metadata.get(autoConfigurationClass, "ConditionalOnClass");
  7.             if (onClass != null && !ClassUtils.isPresent(onClass, classLoader)) {
  8.                 return ConditionOutcome.noMatch("Required class not found: " + onClass);
  9.             }
  10.         }
  11.         ...
  12.     }
  13. }
复制代码

  
三、自动装配完整流程

   

  • 启动类扫描:@SpringBootApplication 触发 @EnableAutoConfiguration。
  • 加载设置类列表:AutoConfigurationImportSelector 读取 AutoConfiguration.imports 或 spring.factories 文件。
  • 过滤设置类:通过条件注解(如 @ConditionalOnClass)排除不满足条件的设置类。
  • 注册 Bean:剩余的设置类通过 @Bean 方法向容器注册组件。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表