从源码分析 spring-boot 应用的启动过程
spring factory 机制
在 spring-core 中有一套机制,可以在 META-INF/spring.factories 文件中定义 interface-class 的键值对,然后在需要用到 interface 的地方通过 SpringFactoriesLoader 将所有 class 实例化。
spring-boot 启动过程
spring-boot 应用使用 SpringApplication 类开始启动
| 1 | SpringApplication.run(App.class, args); | 
静态的 run 方法会 new 一个 SpringApplication 实例,再调用 run 成员方法,在 SpringApplication 的构造方法如下:
| 1 | public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { | 
run 方法如下
| 1 | public ConfigurableApplicationContext run(String... args) { | 
getRunListeners
getRunListeners 通过 SpringFactoriesLoader 加载到了 EventPublishingRunListener
EventPublishingRunListener 包含一个 SimpleApplicationEventMulticaster 用来做事件处理, EventPublishingRunListener 提供不同的方法用来发布不同的事件
| 方法 | 事件 | 
|---|---|
| starting | ApplicationStartingEvent | 
| environmentPrepared | ApplicationEnvironmentPreparedEvent | 
| contextPrepared | ApplicationContextInitializedEvent | 
| contextLoaded | ApplicationPreparedEvent | 
| started | ApplicationStartedEvent | 
| running | ApplicationReadyEvent | 
| failed | ApplicationFailedEvent | 
这些事件由在 spring.factories 中读取的 ApplicationListener 来响应
prepareEnvironment
准备环境,根据不同的 webApplicationType (SpringApplication 构造方法中设值) 生成不同的 Environment 实例,然后读取和设定配置
| 1 | private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, | 
prepareContext
准备 application context, 在 application context 做 refresh 之前设定一些默认的配置
| 1 | private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, | 
注解
spring boot 应用的一个重要的注解是 @SpringBootApplication,它是一个合成的注解,由 3 个注解组成:
- @SpringBootConfiguration,相当于 @Configuration,所以可以在有 @SpringBootApplication 的类里通过 @Bean 来配置;
- @EnableAutoConfiguration,开启 auto configuration 功能;
- @ComponentScan,扫描类路径,找通过 @Component 等注解配置的 bean