前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从apollo的初始化看spring boot 1.5.3启动过程( 一)

从apollo的初始化看spring boot 1.5.3启动过程( 一)

作者头像
MickyInvQ
发布2020-09-27 10:09:08
6460
发布2020-09-27 10:09:08
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏

最早接触springboot,给人第一印象的是两个关键点。

在这里插入图片描述
在这里插入图片描述
  • @SpringBootApplication
  • SpringApplication 以及 run() 方法

一、springApplication 实例的初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中,四个关键的步骤已标注在图中,分别解释如下

  • ① 推断应用的类型:创建的是否为 Servlet 或者 webApplicationContext的一种
  • ② 使用 SpringFactoriesLoader.loadFactoryNames查找并加载 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer
在这里插入图片描述
在这里插入图片描述
  • ③ 使用 SpringFactoriesLoader.loadFactoryNames查找并加载 classpathMETA-INF/spring.factories文件中的所有可用的 ApplicationListener
在这里插入图片描述
在这里插入图片描述

这里贴一下寻找的代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其实,每次寻找都会全盘加载,然后再选取某一类型的,个人理解,这样会造成多次IO读写,可采用使用map一次IO读取,然后缓存后,多次使用。

  • ④ 推断并设置 main方法的定义类
在这里插入图片描述
在这里插入图片描述

二、SpringApplication 的run()方法

在这里插入图片描述
在这里插入图片描述

各个主要步骤我已经标注在上图之中了,除此之外,我也按照自己的理解画了一个流程图如下所示,可以对照数字标示看一下:

在这里插入图片描述
在这里插入图片描述

这个获取的时候通过

在这里插入图片描述
在这里插入图片描述

这个方法,将RunListener类型的类加载进来。 这个在spring .factories

在这里插入图片描述
在这里插入图片描述

打开下面的实现类:

在这里插入图片描述
在这里插入图片描述

其主要功能,是之前初始化springApplication时候加载好的listeners进行调用,这里其实也采用了观察者模式,所有的listeners是观察者,然后主角为 runListener。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

循环调用实现类的starting,但是现在spring只有一个实现类,即EveentPublishingRunListener,后续官方可能会有更多实现类。

所以就是调用如下的staring方法:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里就是环境准备时候做的东西

在这里插入图片描述
在这里插入图片描述

会调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

就是上面这里触发调用apollo的初始化工作,为什么这么说,且听我慢慢道来。 首先初始化springApplication的时候加载了很多listener,其中有一个实现类叫做

代码语言:javascript
复制
ConfigFileApplicationListener
在这里插入图片描述
在这里插入图片描述

在listener调用 onApplicationEvent的时候 ,会调用ConfigFileApplicationListener 类的onApplicationEvent方法

在这里插入图片描述
在这里插入图片描述

注意此loadPostProcessors()方法,会将所有实现了EnvironmentPostProcessor接口的类获取。

在这里插入图片描述
在这里插入图片描述

获取后执行postProcessEnvironment方法 而apollo的初始化逻辑便放在这里面。

继续之前的 探索:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

刷新,完成IoC容器可用的最后一步 !!!

代码语言:javascript
复制
@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、springApplication 实例的初始化
  • 二、SpringApplication 的run()方法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档