Spring Boot 启动原理¶
一、入口¶
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
二、@SpringBootApplication¶
组合注解:
1. @ComponentScan¶
扫描当前包及子包的 @Component/@Service/@Controller。
2. @EnableAutoConfiguration¶
根据 classpath 下的依赖,自动配置 Bean。
3. @SpringBootConfiguration¶
标记这是一个配置类。
三、SpringApplication.run 流程¶
- 创建 SpringApplication:
- 推断应用类型(Servlet/Reactive)。
-
加载 ApplicationContextInitializer、ApplicationListener。
-
prepareContext:
- 创建 ApplicationContext。
- 执行初始化器。
-
加载主配置类。
-
refreshContext:
- 调用 AbstractApplicationContext.refresh()。
- 实例化所有 Bean。
-
启动内嵌 Tomcat。
-
callRunners:
- 执行 ApplicationRunner、CommandLineRunner。
四、自动配置原理¶
@EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 加载:
里面列了所有自动配置类,按条件注解(@ConditionalOnClass 等)决定是否生效。
五、一句话¶
Spring Boot = 约定优于配置,自动帮你把 Bean 配好。
高频追问
- 为什么 starter 能自动配置?SPI 机制。
- 内嵌 Tomcat 怎么启动?refresh 时创建 Tomcat 对象,调用 start。