从apollo的初始化看spring boot 1.5.3启动过程( 一)
最早接触springboot,给人第一印象的是两个关键点。
- @SpringBootApplication
- SpringApplication 以及 run() 方法
一、springApplication 实例的初始化
其中,四个关键的步骤已标注在图中,分别解释如下
- ① 推断应用的类型:创建的是否为
Servlet
或者webApplicationContext
的一种 - ② 使用
SpringFactoriesLoader.loadFactoryNames
查找并加载 classpath下META-INF/spring.factories
文件中所有可用的 ApplicationContextInitializer
- ③ 使用
SpringFactoriesLoader.loadFactoryNames
查找并加载classpath
下META-INF/spring.factories
文件中的所有可用的ApplicationListener
这里贴一下寻找的代码:
其实,每次寻找都会全盘加载,然后再选取某一类型的,个人理解,这样会造成多次IO读写,可采用使用map一次IO读取,然后缓存后,多次使用。
- ④ 推断并设置 main方法的定义类
二、SpringApplication 的run()方法
各个主要步骤我已经标注在上图之中了,除此之外,我也按照自己的理解画了一个流程图如下所示,可以对照数字标示看一下:
这个获取的时候通过
这个方法,将RunListener类型的类加载进来。
这个在spring .factories
中
打开下面的实现类:
其主要功能,是之前初始化springApplication
时候加载好的listeners
进行调用,这里其实也采用了观察者模式,所有的listeners是观察者,然后主角为 runListener。
循环调用实现类的starting,但是现在spring只有一个实现类,即EveentPublishingRunListener,后续官方可能会有更多实现类。
所以就是调用如下的staring方法:
在这里就是环境准备时候做的东西
会调用
就是上面这里触发调用apollo的初始化工作,为什么这么说,且听我慢慢道来。 首先初始化springApplication的时候加载了很多listener,其中有一个实现类叫做
ConfigFileApplicationListener
在listener调用 onApplicationEvent
的时候 ,会调用ConfigFileApplicationListener
类的onApplicationEvent
方法
注意此loadPostProcessors()
方法,会将所有实现了EnvironmentPostProcessor
接口的类获取。
获取后执行postProcessEnvironment
方法
而apollo的初始化逻辑便放在这里面。
继续之前的 探索:
刷新,完成IoC容器可用的最后一步 !!!
@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();
}
- IntelIj IDEA运行JUnit Test OutOfMemoryError
- git pull fails “unable to resolve reference” “unable to update local ref”
- 使用dropwizard(5)--加入swagger
- 使用hint来调优sql语句(72天)
- 用R语言对城管事件数据分析
- 使用dropwizard(4)-加入测试-jacoco代码覆盖率
- goldengate学习-安装篇(71天)
- 使用dropwizard(6)-国际化-easy-i18n
- 配置不同环境下启用swagger,在生产环境关闭swagger
- 使用ControllerAdvice注意事项,Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.
- rac节点无法启动ORA-29702的问题及分析(70天)
- SpringMVC,SpringBoot文件下载
- SpringCloud学习1-服务注册与发现(Eureka)
- 物化视图全量刷新与insert的redo生成量测试(69天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) B. Cards Sorting 树状数组+技巧
- MySQL DML 操作
- select 查询基础
- 带大家体验一下删库跑路,不是虚拟机,是真的服务器哦!
- 数据库压力测试方法概述
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B. Bash's Big Day (Hash+简单数论)
- 随机点名系统——html初学实战
- Centos 7 使用 rpm 安装 JDK 1.8
- PAT (Advanced Level) Practice 1145 Hashing - Average Search Time (25分)
- Centos 7使用 rpm 安装 MySQL 5.7
- Leetcode 300. 最长上升子序列(n方dp,nlogn贪心+二分查找)
- select 进阶查询
- Codeforces Round #627 (Div. 3) E. Sleeping Schedule (DP)
- PAT (Advanced Level) Practice 1144 The Missing Number (20分)
- JDBC 基础操作