从源码分析 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