在前四期及扩展篇中,我们深入探讨了 Spring 的 IoC 容器、Bean 创建、AOP 和事务管理,这些是 Spring 框架的基石。而 Spring Boot 作为 Spring 的进化版,通过自动装配大幅简化了开发流程。本篇将聚焦 Spring Boot 的自动装配机制,揭秘其如何通过源码实现“约定优于配置”的哲学。
1. 自动装配的本质
Spring Boot 的自动装配(AutoConfiguration)是一种条件化的 Bean 配置机制。它通过预定义的配置类,根据项目依赖和环境动态加载所需的 Bean,避免手动配置。例如,引入 spring-boot-starter-web
后,Spring Boot 自动配置 DispatcherServlet
和 Tomcat,无需显式声明。
核心问题:
- 如何判断需要加载哪些配置?
- 如何实现条件化装配?
答案在于 @SpringBootApplication
和 spring.factories
。
2. @SpringBootApplication 的秘密
一个典型的 Spring Boot 应用从以下代码开始:
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
@SpringBootApplication
是一个复合注解,包含:
@SpringBootConfiguration
:标记为配置类,等价于@Configuration
。@EnableAutoConfiguration
:启用自动装配。@ComponentScan
:扫描组件。
2.1 @EnableAutoConfiguration 的作用
@EnableAutoConfiguration
是自动装配的入口,其定义如下:
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@Import
引入了AutoConfigurationImportSelector
,负责加载自动配置类。
3. AutoConfigurationImportSelector 的核心逻辑
AutoConfigurationImportSelector
的 selectImports()
方法是自动装配的关键:
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfig