博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot启动分析
阅读量:6972 次
发布时间:2019-06-27

本文共 2402 字,大约阅读时间需要 8 分钟。

通常我们都是在main方法中调用SpringApplication.run()方法启动SpringBoot应用的,

今天来看一下启动过程中都干了些什么。上图。

大致分为两步,第一步new一个SpringApplication对象,第二步调用其run方法。

在创建SpringApplication对象的时候做了以下几件事情:

(1)判断应用是不是Web应用,判断的依据是classpath中有没有Servlet和ConfigurableWebApplicationContext,具体来讲就是,能不能成功获取到它们的Class对象

(2)设置Initializer和Listener

(3)判断main方法

这里有必要了解一下ApplicationContextInitializer和ApplicationListener是干什么的

首先,ApplicationContextInitializer它是初始化Spring ConfigurableApplicationContext的时候的回调接口,它会先于ConfigurableApplicationContext的refresh()方法被调用。而我们知道ConfigurableApplicationContext的refresh()方法是在AbstractApplicationContext中实现的。

ApplicationListener是一个基于标准的EventListener的事件监听器,用的是观察者模式。

这两步都有一个共同点就是都调用getSpringFactoriesInstances()方法,下面看下:

它的作用就是从classpath中所有的META-INF/spring.factories文件中找到指定Key的值。(注意:是所有的META-INF/spring.factories)

然后将其以List形式返回,并实例化它们。

在我们的例子中,这两次找的key值分别是:org.springframework.context.ApplicationContextInitializer和org.springframework.context.ApplicationListener

我们具体看一下它们的值是什么

总之呢,我们可以知道在容器启动的过程中,ApplicationContextInitializer的initialize()方法在AbstractApplicationContext的refresh()方法之前被调用。

到此为止,SpringApplication对象已经创建好了,接下来调用其run()方法。


这里先来了解一下SpringApplicationRunListener,它是SpringApplication#run()方法的一个监听器,并没有什么实质性的作用。

接下来在看run方法的时候,我们将忽略SpringApplicationRunListener这个监听器。


第1步、创建一个ApplicationArguments对象,它是对我们运行时传进来的参数的一个封装

第2步、创建并配置Environment。这里,如果是web环境,则创建StandardServletEnvironment,否则创建一个StandardEnvironment

第3步、打印Banner

第4步、初始化ApplicationContext。这里,如果是web环境,则实例化AnnotationConfigEmbeddedWebApplicationContext,否则实例化AnnotationConfigApplicationContext。

第5步、创建FailureAnalyzers对象

第6步、准备上下文

(1)如果BeanNameGenerator不为空,将其注册到BeanFactory。(PS:其实就是ApplicationContext)

(2)调用所有ApplicationContextInitializer的initialize()方法

(3)将ApplicationArguments和Banner的实例注册到Context

(4)加载Sources

到这里,sources中所有的Bean都被加载到Context中了

第7步、刷新Context。这里它直接调用的AbstractApplicationContext的refresh()方法,前面的文章已经介绍过了,这里不再赘述。

第8步、调用Context中所有的ApplicationRunner和CommandLineRunner

到此为止,启动完成!!!

总结:

第1步、所有的源对象(source)保存到Set<Object> sources成员变量中

第2步、判断是否web环境

第3步、设置Initializer和Listener

第4步、判断main方法

第5步、创建ApplicationArguments对象

第6步、创建并配置环境

第7步、创建Banner

第8步、创建ApplicationContext

第9步、配置ApplicationContext。在这一步中会回调所有的ApplicationContextInitializer,还会注册一些特殊的Bean到Context,最重要的是会加载sources中所配置的所有的Bean到Context中。

第10步、刷新Context。这里直接调用AbstractApplicationContext的refresh()方法。

第11步、调用容器中所有的ApplicationRunner和CommandLineRunner

本文转自   手不要乱摸  51CTO博客,原文链接:http://blog.51cto.com/5880861/1970708

转载地址:http://yposl.baihongyu.com/

你可能感兴趣的文章
HTML <img> 标签的 height 和 width 属性
查看>>
QT 用listveiw显示图片
查看>>
KVO 底层实现
查看>>
【Todo】Java的JIT机制
查看>>
使用node 创建一个新项目
查看>>
主机名/etc/hosts文件的作用
查看>>
vue 使用props 实现父组件向子组件传数据
查看>>
php课程 10-35 php实现文件上传的注意事项是什么
查看>>
php实现 合唱队形(算法想清楚在动)
查看>>
html5--6-47 阶段练习2-渐变按钮
查看>>
手机归属地查询
查看>>
How to Setup MySQL (Master-Slave) Replication in CentOS
查看>>
Vue学习笔记 template methods,filters,ChromeDriver,安装sass
查看>>
java加密算法-SHA1
查看>>
target file里面的每个string字段的双引号怎么去掉
查看>>
python基础
查看>>
HDU 1285
查看>>
ios 重写UIFont方法 自定义字体类型及大小
查看>>
TortoiseGit连接github.com
查看>>
[笔记] 简单的Testbench设计(八)
查看>>