关于spring -boot的启动原理

2019-03-06  本文已影响0人  小河土

启动原理:

1.spring boot


我们可以到这里是直接调用springApplication的static run方法。

其实这里是实例化一个SpringApplication对象。传入源和一个args参数。


第一步:这里是调用了SprngApplication的有参构造,然后我们可以看到这里面有个initialize方法


我们来看下这个方法


1.这里首先是判断如果传入的source(源)不为空就把它加入到sources 这个变量里面

2.判断是不是web环境

3.然后就是从classpath 下面的META-INF/spring.factories 这个文件获取所有的ApplicationContextInitializer对应的value 加载到initializers这个集合里面

4.然后就是从classpath 下面的META-INF/spring.factories 这个文件获取所有的ApplicationListener对应的value 加载到listeners这个集合里面。

5.然后就是推断main方法。

然后initializer 方法就执行完了。

第二步:就是run方法了


1.开始的话是一个码表计时器StopWatch对象。

2.然后就是声明一个context和analyzers变量

3.configureHeadlessProperty()方法是设置系统变量java.awt.headless。

4.getRunListeners 是从从classpath 下面的META-INF/spring.factories 这个文件获取所有的SpringApplicationRunListener 然后进行排序,然后再调用他们的starting方法,开始监听。

5.实例话一个ApplicationArguments 对象

6.prepareEnvironment 这里是准备环境


getOrCreateEnvironment是配置环境,

这里其实就是看我们自己有没有设置环境,然后再判断是不是web,如果不是就使用标准的环境。


这里配置好环境了,判断如果你不是web环境,就转换成标准的环境,到这里环境就基本设置好了。


7.然后就是输出Banner对象。就是项目启动的那个图标

8.createApplicationContext就是创建一个context,


如果context 为空,就根据环境来加载,如果是web环境,就实例化AnnotationConfigEmbeddedWebApplicationContext对象,否则就实例化ConfigurableWebApplicationContext这个对象。如果不为空就用我们自己的context。

9.prepareContext 准备context

这里面是设置环境 然后就是 postProcessApplicationContext做一个后置的回调,

applyInitializers 方法是回调ApplicationContextInitializer所有initializer 的方法 然后就是发布事件

如果beanNameGenerator不为空就把她注册到context里面去

如果resourceLoader不为空·····就把它注册到context里面去,

然后注入baen springApplicationArguments对象 springBootBanner对象到spring 容器里面

load 方法 最后就加载所有的源到context里面去。

然后整个容器就准备完成了。


refreshContext context 判断是否要执行一个registerShutdownHook钩子,如果是就注册一个。

afterRefresh 就是作最后的容器刷新。

listeners.finished监听器停止。

然后就是停止计时器码表。

以上就是spring boot整个的运行流程。

上一篇下一篇

猜你喜欢

热点阅读