慢吞云雾缓吐愁 发表于 2025-4-2 03:23:11

Spring Boot 自动设置

目录
@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 注解

[*]触发自动装配的入口。

https://i-blog.csdnimg.cn/direct/f491cc6fe6cd44b5b732db20e79fb5a1.png


[*]    spring.factories 文件(Spring Boot 2.x)或 AutoConfiguration.improts(Spring Boot 3.x)

[*]界说自动设置类的列表

https://i-blog.csdnimg.cn/direct/1cb7aa09db5b44aca81f4ac8667e30d7.png


[*]    @ConditionalOnXXX(eg. @ConditionalOnClass)

[*]决定是否加载某个设置

https://i-blog.csdnimg.cn/direct/8c4b475f90654f2b81bc3a516942625d.png
二、源码分析流程

2.1 起点:@SpringBootApplication

   Spring Boot应用的启动类通常标注 @SpringBootApplication,该注解是一个组合注解:
@SpringBootConfiguration
@EnableAutoConfiguration// 关键注解,触发自动装配
@ComponentScan
public @interface SpringBootApplication {} 2.2 @EnableAutoConfiguration 的作用

   @EnableAutoConfiguration 通过 @Import 引入了 AutoConfigurationImportSelector类:
https://i-blog.csdnimg.cn/direct/379f8e382fcb42839d5391e5afdc94ee.png
2.3  AutoConfigurationImportSelector 源码分析

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

[*]AutoConfigurationImportSelector 负责加载全部自动装配类:
https://i-blog.csdnimg.cn/direct/5e4a070ee2d1446fb2fb0452c99d1b6b.png
 关键方法 getAutoConfigurationEntry:

[*] 从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x+)或 spring.factories(Spring Boot 2.x)加载设置类列表。
[*] 过滤掉不满足条件的设置类(基于条件注解)。
[*] 2.xx版本:SpringFactoriesLoader.loadSpringFactories() 方法负责加载设置类
https://i-blog.csdnimg.cn/direct/0d1e22efba374751b0c52e292d9d9fb8.png
 https://i-blog.csdnimg.cn/direct/2855d37abb6348ba9f4bb484f474525f.png
2.4 自动设置类加载过程

以 Spring Boot 3.x 为例,自动设置类界说在文件中:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容示例:
https://i-blog.csdnimg.cn/direct/9fd04ce53377436b87c6ab5a86bf96f1.png
2.5 自动设置类的条件过滤 

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

OnClassCondition 是 @ConditionalOnClass 的实际执行类
public class OnClassCondition extends FilteringSpringBootCondition {
    @Override
    protected ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata metadata) {
      // 检查类路径是否存在指定类
      for (String autoConfigurationClass : autoConfigurationClasses) {
            String onClass = metadata.get(autoConfigurationClass, "ConditionalOnClass");
            if (onClass != null && !ClassUtils.isPresent(onClass, classLoader)) {
                return ConditionOutcome.noMatch("Required class not found: " + onClass);
            }
      }
      ...
    }
}
三、自动装配完整流程

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

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