码迷,mamicode.com
首页 > 编程语言 > 详细

Spring Boot 系统初始化器是如何别调用的,以及实现原理

时间:2020-02-06 23:21:59      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:his   上下   原理   属性   设置   idt   增加   utils   beanutils   

1、ApplicationContextInitializer的作用

上下文刷新即refresh方法前调用

用来编码设置一些属性变量通常用在web环境中

可以通过order接口进行排序

 

2、进入run方法

技术图片

 

 

进入准备上下文prepareContext方法

技术图片

 

 进入applyInitializers方法。遍历所有的初始化器,并调用对应初始化器的initialize方法

技术图片

 

 getInitializers返回所有的初始化器。

public Set<ApplicationContextInitializer<?>> getInitializers() {
return asUnmodifiableOrderedSet(this.initializers);
}


3、系统初始器方式二的实现原理
实现方式二如下图:

技术图片

 

 

 实例化SpringApplication时设置setinitializers

技术图片

 

 通过springApplication.addInitializers(new SecondInitializer()); 增加自定义的初始化器

技术图片

 

 然后是springApplication.run(args);的run方法 。和方式一的run方法是同一个。

 

 

 

4、系统初始器方式三的实现原理
方式三是通过在application.properties 文件中添加配置context.initializer.classes=com.example.demo.initializer.ThirdInitializer来实现的。
这个主要是通过DelegatingApplicationContextInitializer初始化器来实现的
这个类DelegatingApplicationContextInitializer定义在SpringBoot中

技术图片

 

 

2)进入DelegatingApplicationContextInitializer类

可以看到DelegatingApplicationContextInitializer里的order=0。这个初始化器最先被调到。

技术图片

 

 

 

然后进入applyInitializerClasses方法

技术图片

 

利用instantiateInitializer方法初始化这个类。

instantiateInitializer里面其实是用BeanUtils来初始化类

技术图片

 

 

 

 进入applyInitializers方法

技术图片

 

 4、三种实现初始化器的实现原理

方式一:定义在spring.factories 文件中被SpringFactoriesLoader发现注册
方式二:初始化完毕手动添加
方式三: 定义成环境变量被DelegatingApplicationContextInitializer发现注册



 

 



Spring Boot 系统初始化器是如何别调用的,以及实现原理

标签:his   上下   原理   属性   设置   idt   增加   utils   beanutils   

原文地址:https://www.cnblogs.com/linlf03/p/12271258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!