Spring Boot 系统初始化器是如何别调用的,以及实现原理
Posted work hard work smart
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 系统初始化器是如何别调用的,以及实现原理相关的知识,希望对你有一定的参考价值。
1、ApplicationContextInitializer的作用
上下文刷新即refresh方法前调用
用来编码设置一些属性变量通常用在web环境中
可以通过order接口进行排序
2、进入run方法
1) 进入准备上下文prepareContext方法
2) 进入applyInitializers方法。遍历所有的初始化器,并调用对应初始化器的initialize方法
getInitializers返回所有的初始化器。
public Set<ApplicationContextInitializer<?>> getInitializers() {
return asUnmodifiableOrderedSet(this.initializers);
}
3、系统初始器方式二的实现原理
实现方式二如下图:
1)实例化SpringApplication时设置setinitializers
2) 通过springApplication.addInitializers(new SecondInitializer()); 增加自定义的初始化器
3)然后是springApplication.run(args);的run方法 。和方式一的run方法是同一个。
4、系统初始器方式三的实现原理
方式三是通过在application.properties 文件中添加配置context.initializer.classes=com.example.demo.initializer.ThirdInitializer来实现的。
这个主要是通过DelegatingApplicationContextInitializer初始化器来实现的
这个类DelegatingApplicationContextInitializer定义在SpringBoot中
1)进入DelegatingApplicationContextInitializer类
可以看到DelegatingApplicationContextInitializer里的order=0。这个初始化器最先被调到。
2)然后进入applyInitializerClasses方法
利用instantiateInitializer方法初始化这个类。
instantiateInitializer里面其实是用BeanUtils来初始化类
3) 进入applyInitializers方法
4、三种实现初始化器的实现原理
方式一:定义在spring.factories 文件中被SpringFactoriesLoader发现注册
方式二:初始化完毕手动添加
方式三: 定义成环境变量被DelegatingApplicationContextInitializer发现注册
以上是关于Spring Boot 系统初始化器是如何别调用的,以及实现原理的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中初始化一次 MongoClient 并使用它的方法?
Spring Boot 优雅停服的几种方式;别kill -9了
Spring Boot 2.0:Spring Boot 如何解决项目启动时初始化资源