SpringBoot的启动很简单
@SpringBootApplication
- 静态方法run方式,会构造一个SpringApplication的实例,然后再调用这里实例的run方法就表示启动SpringBoot。
return
- new SpringApplication(primarySources) 实例化过程
public
- applicationContextInitializer,应用程序初始化器,做一些初始化的工作
- ApplicationListener,应用程序事件(ApplicationEvent)监听器,应用程序事件(ApplicationEvent)有应用程序启动事件(ApplicationStartedEvent),失败事件(ApplicationFailedEvent),准备事件(ApplicationPreparedEvent)等,而应用程序事件监听器跟监听事件是绑定的。比如ConfigServerBootstrapApplicationListener只跟ApplicationEnvironmentPreparedEvent事件绑定。
run方法
要理解上述代码首先需要先理解 观察者模式
SpringApplicationRunListeners
RunListener是发布者,listener是订阅者。注意区别
public
总结
new SpringApplication(primarySources) 实例化过程
- 把参数sources设置到SpringApplication属性中,这个sources可以是任何类型的参数。本文的例子中这个sources就是MyApplication的class对象
- 判断是否是web程序,并设置到webEnvironment这个boolean属性中
- 找出所有的初始化器,默认有5个,设置到initializers属性中
- 找出所有的应用程序监听器,默认有9个,设置到listeners属性中
- 找出运行的主类(main class)
run方法
- 构造一个StopWatch,观察SpringApplication的执行
- 找出所有的SpringApplicationRunListener并封装到SpringApplicationRunListeners中,用于监听run方法的执行。监听的过程中会封装成事件并广播出去让初始化过程中产生的应用程序监听器进行监听
- 构造Spring容器(ApplicationContext),并返回
3.1 创建Spring容器的判断是否是web环境,是的话构造AnnotationConfigEmbeddedWebApplicationContext,否则构造AnnotationConfigApplicationContext
3.2 初始化过程中产生的初始化器在这个时候开始工作
3.3 Spring容器的刷新(完成bean的解析、各种processor接口的执行、条件注解的解析等等) - 从Spring容器中找出ApplicationRunner和CommandLineRunner接口的实现类并排序后依次执行
本质上springboot的启动过程的核心仍然是spring容器创建
只是在容器创建的基础上增加了监听|事件机制,从而可以扩展功能。
?究竟发布事件后,各监听器做了什么事情还没有了解