目录
@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,该注解是一个组合注解:
- @SpringBootConfiguration
- @EnableAutoConfiguration // 关键注解,触发自动装配
- @ComponentScan
- 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:
- @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企服之家,中国第一个企服评测及商务社交产业平台。 |