跳转至

Spring Boot 启动原理

一、入口

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

二、@SpringBootApplication

组合注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

1. @ComponentScan

扫描当前包及子包的 @Component/@Service/@Controller。

2. @EnableAutoConfiguration

根据 classpath 下的依赖,自动配置 Bean。

3. @SpringBootConfiguration

标记这是一个配置类。

三、SpringApplication.run 流程

  1. 创建 SpringApplication
  2. 推断应用类型(Servlet/Reactive)。
  3. 加载 ApplicationContextInitializer、ApplicationListener。

  4. prepareContext

  5. 创建 ApplicationContext。
  6. 执行初始化器。
  7. 加载主配置类。

  8. refreshContext

  9. 调用 AbstractApplicationContext.refresh()。
  10. 实例化所有 Bean。
  11. 启动内嵌 Tomcat。

  12. callRunners

  13. 执行 ApplicationRunner、CommandLineRunner。

四、自动配置原理

@EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 加载:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

里面列了所有自动配置类,按条件注解(@ConditionalOnClass 等)决定是否生效。

五、一句话

Spring Boot = 约定优于配置,自动帮你把 Bean 配好。

高频追问

  • 为什么 starter 能自动配置?SPI 机制。
  • 内嵌 Tomcat 怎么启动?refresh 时创建 Tomcat 对象,调用 start。