启动原理:
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整个的运行流程。
网友评论