springboot-Initializer例子及分析
【README】
1,本文主要編寫了 初始化器例子并分析了其調(diào)用路徑;?
2,初始化器的執(zhí)行順序 先于 后置處理器; 后置處理器,refer2? springboot:BeanPostProcessor示例及分析_PacosonSWJTU的博客-CSDN博客【README】1,本文主要分析 BeanPostProcessor 的作用, 開發(fā)方式;2,BeanPostProcessor 是bean后置處理器, 簡(jiǎn)而言之就是bean被創(chuàng)建好了,之后如果需要對(duì)其屬性進(jìn)行修改,則 需要使用 BeanPostProcessor 來(lái)起作用;3,本文還順帶介紹了 InitializingBean 接口; 啥都不說(shuō),先上代碼;【1】 BeanPostProcessor 例子0,借助 BeanPostProcessor ,Initializin...https://blog.csdn.net/PacosonSWJTU/article/details/121322957
【1】Initializer 初始化器例子
【1.1】初始化器
編寫2個(gè)初始化器
// 初始化器1 @Order(0) public class Hello01Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("===log=== Hello01Initializer.initialize() start...");ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> map = new HashMap<>();map.put("key1", "v1");MapPropertySource mapPropertySource = new MapPropertySource("hello01Initializer", map);environment.getPropertySources().addLast(mapPropertySource);System.out.println("===log=== Hello01Initializer.initialize() over...");} }// 初始化器2 @Order(0) public class Hello02Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("===log=== Hello02Initializer.initialize() start...");ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> map = new HashMap<>();map.put("k2", "v2");MapPropertySource mapPropertySource = new MapPropertySource("hello02Initializer", map);environment.getPropertySources().addLast(mapPropertySource);System.out.println("===log=== Hello02Initializer.initialize() over...");} }【1.2】配置初始化器
在 spring.factories 配置 初始化器1 ,如下
# 初始化器 org.springframework.context.ApplicationContextInitializer=\ com.cmc.tr.springbt02config02.initializer.Hello01Initializer在主程序中添加初始化器2 ;
@SpringBootApplication public class Springbt02Config02Application {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(Springbt02Config02Application.class);// 添加初始化器2 springApplication.addInitializers(new Hello02Initializer());springApplication.run(args);} }打印結(jié)果:
===log=== Hello01Initializer.initialize() start...
===log=== Hello01Initializer.initialize() over...
===log=== Hello02Initializer.initialize() start...
===log=== Hello02Initializer.initialize() over...
很明顯, 初始化器1 的加載順序, 先于 初始化器2 ;
【2】調(diào)用路徑
【2.1】查看調(diào)用棧
調(diào)用路徑大致為:
step1, SpringApplication.run() 方法;
從上圖,我們看到, 初始化器是從 prepareContext() 開始調(diào)用的;
而 后置處理器是從 refreshContext() 開始調(diào)用的; 后置處理器 refer2 ?springboot:BeanPostProcessor示例及分析_PacosonSWJTU的博客-CSDN博客 ;
(干貨)所以 初始化器的執(zhí)行順序 先于 后置處理器;
【補(bǔ)充】 關(guān)于 SpringApplication.refreshContext() 方法邏輯,包括但不限于(我這里沒有列舉完)
step2, SpringApplication.prepareContext(); 方法;
?step3, SpringApplication.applyInitializers() 應(yīng)用初始化器方法;
?step4,調(diào)用自定義初始化器方法.initialize() 方法;
總結(jié)
以上是生活随笔為你收集整理的springboot-Initializer例子及分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 哪些电脑是专业显卡(哪个是电脑显卡)
- 下一篇: java阻塞队列小结