目标
了解Spring Boot的启动流程
步骤
每个 Spring Boot 项目都有一个用 @SpringBootApplication 注释的主启动类。
class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
public
通过直接检查 SpringApplication.run 方法,你会发现整个启动过程分为两部分:SpringBootApplication构造函数和run方法的执行。
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return new SpringApplication(primarySources).run(args);
}
核心注释
当您打开 @SpringBootApplication 注释时,您会发现一堆注释,但重要的是要关注三个核心注释:
@SpringBootConfiguration
它是 @Configuration 注释的包装器。它通过JavaConfig配置bean,将当前类标记为配置类。
@EnableAutoConfiguration
打开 @EnableAutoConfiguration 注解可以看到两个核心注解:@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
@AutoConfigurationPackage与 @Component 注释的含义类似。一种用于手动添加注解来加载自动配置类,另一种用于扫描指定路径来注入bean。 @AutoConfigurationPackage 用于在单个路径中加载多个自动配置类时。该注解无需为每个类单独添加 @Import ,从而更方便地简单地导入包路径。 @ComponentScan 对于自定义包路径很有用,例如,当某些 Bean 与 SpringBootApplication 不在同一路径中时。
@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationImportSelector.class) 涉及 AutoConfigurationImportSelector 类,特别是它的 getCandidateConfigurations() 方法。此方法使用 SpringFactoriesLoader.loadFactoryNames() 查找并加载 META-INF/spring.factories 文件中列出的所有自动配置类。
@ComponentScan
1、默认情况下,它扫描当前包及其子包。用 @Component 、 @Controller 、 @Service 、 @Repository 等注解的类注册在容器中供使用。
上面的注释只是将必要的类加载到类路径中。获取类并将其转换为 bean 的实际过程发生在 run 方法中。因此,在回答这方面的问题时,建议先提及核心注释。主要的启动流程还是围绕SpringBootApplcation类的构造函数和run方法展开。
概括
Spring Boot应用程序启动的总体步骤。
1、整个Spring框架的启动分为两部分: constructing a SpringApplication object 和执行 run 方法。
2、核心注解 @SpringBootConfiguration 表示启动类是一个配置类。 @EnableAutoConfiguration 通过其内部 @Import 注释 AutoConfigurationImportSelector.class 实现自动配置。 @ComponentScan 默认情况下扫描当前目录及其子目录中的 bean。
3、构造函数:
- 根据servlet类是否加载来判断是否为Web环境。
- 检索所有初始化器,扫描 META-INF/spring.factories 下的所有
ApplicationContextInitializer 子类并通过反射获取实例,以在Spring实例启动前后执行一些回调操作。 - 检索所有监听器,与上面类似,扫描配置并加载相应的类实例。
- 找到主要方法。