当 Spring Boot 启动时,会执行SpringApplication.run()方法,该方法会加载 Spring 容器,并解析@SpringBootApplication注解。
@SpringBootApplication是一个复合注解,它包含@SpringBootConfiguration、@ComponentScan和@EnableAutoConfiguration三个核心注解:
@SpringBootConfiguration会将启动类标记为配置类,从而解析其中的@ComponentScan;@EnableAutoConfiguration底层使用了@Import注解去导入一个自动配置类的选择器(AutoConfigurationImportSelector),这个选择器会通过 SPI 机制加载所有自动配置类(位于META-INF/spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中);- SPI(Service Provider Interface)原理:SPI 是 Java 提供的一种服务发现机制,允许框架或应用程序在运行时动态加载实现类。其核心思想是“面向接口编程 + 配置文件约定”。
- 实现方式:服务提供者(如各种 Spring Boot Starter)在
META-INF/services/目录下创建一个以接口全限定名命名的文件,文件中写入实现类的全限定名。在 Spring Boot 中,这一机制被扩展用于spring.factories和AutoConfiguration.imports文件。 - 加载过程:
AutoConfigurationImportSelector会使用SpringFactoriesLoader.loadFactoryNames()方法扫描 classpath 下所有 jar 包中的META-INF/spring.factories文件,读取org.springframework.boot.autoconfigure.EnableAutoConfiguration键对应的自动配置类全名列表。 - 优势:实现了自动配置类的解耦和可插拔。第三方 Starter 只需按照约定提供配置文件,无需修改 Spring Boot 核心代码,即可被自动发现和加载。
- 并不是所有自动配置类都会生效,Spring Boot 会根据
@Conditional系列的注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)进行条件过滤; - 最终,满足条件的自动配置类会被解析并注册到 Spring 容器中,后续这些配置类就能生效,为应用提供默认的 Bean 和配置。