知识的领域是无限的,我们的学习也是无限期的。这篇文章主要讲述Spring Boot深入原理 - SpringApplication启动原理相关的知识,希望能为你提供帮助。
Spring Boot深入原理 - SpringApplication启动原理我们知道,如果不需要特殊的配置,只需要在main方法里调用SpringApplicatio.run()方法即可启动Spring Boot应用:
- public static void main(String[] args) throws Exception {
- SpringApplication.run(Application.class, args);
- }
SpringApplication启动流程【Spring Boot深入原理 - SpringApplication启动原理】SpringApplication的启动过程非常复杂,下面是在调用SpringApplication.run方法之后启动的关键动作:
文章图片
既然要了解SpringApplication的启动流程,第一步当然是进入源码里看看喽:
- public ConfigurableApplicationContext run(String... args) {
- StopWatch stopWatch = new StopWatch();
- stopWatch.start();
- ConfigurableApplicationContext context = null;
- FailureAnalyzers analyzers = null;
- configureHeadlessProperty();
- //初始化监听器
- SpringApplicationRunListeners listeners = getRunListeners(args);
- //发布ApplicationStartedEvent
- listeners.starting();
- try {
- //装配参数和环境
- ApplicationArguments applicationArguments = new DefaultApplicationArguments(
- args);
- ConfigurableEnvironment environment = prepareEnvironment(listeners,
- applicationArguments);
- //打印Banner
- Banner printedBanner = printBanner(environment);
- //创建ApplicationContext()
- context = createApplicationContext();
- analyzers = new FailureAnalyzers(context);
- //装配Context
- prepareContext(context, environment, listeners, applicationArguments,
- printedBanner);
- //refreshContext
- refreshContext(context);
- //afterRefresh
- afterRefresh(context, applicationArguments);
- //发布ApplicationReadyEvent
- listeners.finished(context, null);
- stopWatch.stop();
- if (this.logStartupInfo) {
- new StartupInfoLogger(this.mainApplicationClass)
- .logStarted(getApplicationLog(), stopWatch);
- }
- return context;
- }
- catch (Throwable ex) {
- handleRunFailure(context, listeners, analyzers, ex);
- throw new IllegalStateException(ex);
- }
- }
初始化监听器的调用关系很深,为了节省篇幅,就不贴源码了,稍后用专门的文章细聊。
第二步,发布ApplicationStartedEvent事件到这一步,Spring Boot会发布一个ApplicationStartedEvent事件。如果你想在这个时候执行一些代码可以通过实现ApplicationListener接口实现;
下面是ApplicationListener接口的定义,注意这里有个< E extends ApplicationEvent>
- public interface ApplicationListener< E extends ApplicationEvent> extends EventListener
- public class ApplicationStartedListener implements ApplicationListener< ApplicationStartedEvent>
第三步,装配参数和环境在这一步,首先会初始化参数,然后装配环境,确定是web环境还是非web环境。
第四步,发布ApplicationEnvironmentPreparedEvent事件准确的说,这个应该属于第三步,在装配完环境后,就触发ApplicationEnvironmentPreparedEvent事件。如果想在这个时候执行一些代码,可以订阅这个事件的监听器,方法同第二步。
第五步,打印Banner看过Spring Boot实例教程 - 自定义Banner的同学会很熟悉,启动的Banner就是在这一步打印出来的。
第六步,创建ApplicationContext这里会根据是否是web环境,来决定创建什么类型的ApplicationContext,ApplicationContext不要多说了吧,不知道ApplicationContext是啥的同学,出门左转补下Spring基础知识吧。
第七步,装配Context这里会设置Context的环境变量、注册Initializers、beanNameGenerator等。
第八步,发布ApplicationPreparedEvent事件这里放在第七步会更准确,因为这个是在装配Context的时候发布的。
值得注意的是:这里是假的,假的,假的,源码中是空的,并没有真正发布ApplicationPreparedEvent事件。不知道作者这么想的???
第九步,注册、加载等注册springApplicationArguments、springBootBanner,加载资源等。
第十步,发布ApplicationPreparedEvent事件注意,到这里才是真正发布了ApplicationPreparedEvent事件。这里和第八步好让人误解。
第十一步,refreshContext装配context beanfactory等非常重要的核心组件。
第十二步,afterRefreshContext这里会调用自定义的Runners,不知道Runners是什么的同学,请参考Spring Boot官方文档 - SpringApplication
第十三步,发布ApplicationReadyEvent事件最后一步,发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了。通常我们这里会监听这个事件来打印一些监控性质的日志,表示应用正常启动了。添加方法同第二步。
注意:如果启动失败,这一步会发布ApplicationFailedEvent事件。
到这里,Spring Boot启动的一些关键动作就介绍完了。
总结说是深入,本篇文章更像是一个概括性的介绍。因为每个关键动作内容都很多,都很值得深入研究,都放在这里显然空间太小,接下来将会分章节深入每个关键动作。
推荐阅读
- Android studio中2种build.gradle文件介绍
- Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转
- Android 扩大 View 的点击区域
- How to Enable Trace or Debug for APIs executed as SQL Script Outside of the Applications ?
- AndroidStudio刚開始学习的人
- Android中MVCMVPMVVM具体解释
- Android学习笔记——显示运行进度对话框
- 移动端自动化测试appium环境搭建
- android的activity任务栈