Spring Boot 的自动装配(Auto-Configuration)是其核心特性之一,使开发者可以**"开箱即用"**,无需手动配置大量 Bean,极大地提高了开发效率。
一、自动装配的概念
自动装配是指 根据 classpath、已有 Bean 和应用配置,自动为 Spring 容器注入所需的 Bean,而无需手动配置。例如:
java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
引入 spring-boot-starter-web 后,Spring Boot 会自动装配:
-
DispatcherServlet -
Tomcat或其他容器 -
JSON 转换器等 Web 相关组件
二、自动装配的实现原理
1. @SpringBootApplication
-
核心注解,组合了:
-
@SpringBootConfiguration→ 声明配置类 -
@EnableAutoConfiguration→ 开启自动装配 -
@ComponentScan→ 扫描组件
-
-
自动装配的关键是
@EnableAutoConfiguration
2. @EnableAutoConfiguration
- 本质上是:
java
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
- 导入
AutoConfigurationImportSelector,负责读取和选择自动配置类
3. AutoConfigurationImportSelector 流程
-
读取自动配置类
Spring Boot 在
META-INF/spring.factories文件中定义了大量自动配置类:
XML
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
-
条件判断
每个自动配置类通常使用
@Conditional系列注解:-
@ConditionalOnClass→ 当 classpath 存在指定类时生效 -
@ConditionalOnMissingBean→ 当容器中没有该 Bean 时生效 -
@ConditionalOnProperty→ 根据配置文件属性生效
-
示例:
java
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
-
注册 Bean 到容器
符合条件的配置类会被解析为普通
@Configuration,注册对应 Bean 到 Spring 容器中。
三、核心条件注解
| 注解 | 作用 |
|---|---|
@ConditionalOnClass |
classpath 中存在指定类时生效 |
@ConditionalOnMissingBean |
容器中不存在指定 Bean 时生效 |
@ConditionalOnBean |
容器中存在指定 Bean 时生效 |
@ConditionalOnProperty |
配置文件中存在指定属性时生效 |
四、整体流程总结
-
Spring Boot 启动,扫描
@SpringBootApplication -
@EnableAutoConfiguration导入AutoConfigurationImportSelector -
读取
spring.factories中的自动配置类 -
对每个自动配置类进行条件判断
-
符合条件的 Bean 注册到容器
-
应用即可直接使用自动装配的组件
五、面试回答精炼版
Spring Boot 自动装配通过
@EnableAutoConfiguration导入AutoConfigurationImportSelector实现,它读取spring.factories中的自动配置类,并根据@Conditional条件判断是否注册 Bean,从而实现开箱即用。