1. 自动装配的核心机制
1.1 @SpringBootApplication
注解
@SpringBootApplication
是 Spring Boot 的核心注解,它是一个组合注解,包含以下三个注解:
-
@SpringBootConfiguration
:标识当前类是一个 Spring Boot 的配置类。 -
@EnableAutoConfiguration
:启用 Spring Boot 的自动装配功能。 -
@ComponentScan
:启用组件扫描,扫描当前包及其子包中的 Spring Bean。
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
1.2 @EnableAutoConfiguration
@EnableAutoConfiguration
是自动装配的关键注解,它通过 @Import
注解引入了 AutoConfigurationImportSelector
类。AutoConfigurationImportSelector
是一个特殊的类,负责加载和应用自动装配的配置类。
@EnableAutoConfiguration
public class MyApplication {
}
1.3 AutoConfigurationImportSelector
AutoConfigurationImportSelector
是自动装配的核心实现类。它通过以下步骤加载自动装配的配置类:
-
加载
spring.factories
文件: Spring Boot 在启动时会扫描所有META-INF/spring.factories
文件,这些文件中定义了需要加载的自动装配类。 例如# spring-boot-autoconfigure-<version>/META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,...
-
条件判断: 每个自动装配类都使用了
@Conditional
注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
等),这些注解定义了自动装配类的加载条件。Spring Boot 会根据这些条件判断是否加载某个自动装配类。例如:
@Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMissingBean(DataSource.class) public class DataSourceAutoConfiguration {// 配置数据源 }
-
加载配置类: 如果条件满足,Spring Boot 会将对应的自动装配类加载到 Spring 容器中。
2. 自动装配的条件判断
Spring Boot 提供了一系列条件注解,用于控制自动装配类的加载。常见的条件注解包括:
-
@ConditionalOnClass
:当类路径中存在指定的类时,加载配置。 -
@ConditionalOnMissingClass
:当类路径中不存在指定的类时,加载配置。 -
@ConditionalOnBean
:当 Spring 容器中存在指定的 Bean 时,加载配置。 -
@ConditionalOnMissingBean
:当 Spring 容器中不存在指定的 Bean 时,加载配置。 -
@ConditionalOnProperty
:当指定的配置属性存在时,加载配置。 -
@ConditionalOnExpression
:当 SpEL 表达式为true
时,加载配置。
3. 自动装配的实现步骤
3.1 启动类加载
当 Spring Boot 应用启动时,SpringApplication
会加载启动类(如 MyApplication
),并解析 @SpringBootApplication
注解。
3.2 加载 spring.factories
文件
SpringApplication
会扫描所有 META-INF/spring.factories
文件,加载其中定义的自动装配类。
3.3 条件判断
对于每个自动装配类,Spring Boot 会检查其上的条件注解(如 @ConditionalOnClass
、@ConditionalOnBean
等),判断是否满足加载条件。
3.4 加载配置类
如果条件满足,Spring Boot 会将对应的自动装配类加载到 Spring 容器中,并执行其中的配置逻辑。
4. 自定义自动装配
开发者可以通过以下步骤自定义自动装配:
-
创建自动装配类: 创建一个带有
@Configuration
注解的类,并在其中定义需要的 Bean@Configuration @ConditionalOnClass(MyService.class) @ConditionalOnMissingBean(MyService.class) public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService();} }
-
注册自动装配类: 在项目的
resources/META-INF/spring.factories
文件中添加自定义自动装配类的全限定名org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration
5. 总结
Spring Boot 的自动装配通过以下机制实现:
-
@SpringBootApplication
注解:启用自动装配功能。 -
@EnableAutoConfiguration
注解:引入AutoConfigurationImportSelector
。 -
AutoConfigurationImportSelector
类:加载spring.factories
文件中的自动装配类。 -
条件注解:通过
@Conditional
注解控制自动装配类的加载。 -
自定义自动装配:开发者可以通过创建自动装配类并注册到
spring.factories
文件中,自定义自动装配逻辑。
通过自动装配,Spring Boot 能够根据项目依赖和配置自动加载合适的配置,大大简化了 Spring 应用的开发过程。