Springboot中ApplicationContextInitializer的使用及源码分析

文章目录

  • 一、认识ApplicationContextInitializer
    • 1、ApplicationContextInitializer的作用
    • 2、认识ApplicationContextInitializer接口
    • 3、ApplicationContextInitializer的常用用法
      • (1)注册BeanFactoryPostProcessor
      • (2)注册ApplicationListener监听器
      • (3)处理Environment运行环境(获取、修改配置等)
      • (4)设置ApplicationContext的parent
      • (5)注册Bean
      • (6)注册BeanPostProcessor
  • 二、使用ApplicationContextInitializer
    • 1、定义ApplicationContextInitializer实现类
    • 2、注册ApplicationContextInitializer
      • (1)在resources/META-INF/spring.factories配置
      • (2)代码注册
      • (3)配置文件注册
    • 3、查看结果
    • 4、设置执行顺序
  • 三、源码分析
    • 1、加载ApplicationContextInitializer
    • 2、执行时机
  • 参考资料

一、认识ApplicationContextInitializer

1、ApplicationContextInitializer的作用

ApplicationContextInitializer接口的执行时机:用于在刷新之前初始化Spring ConfigurableApplicationContext的回调接口。

通常在需要对应用程序上下文进行一些编程初始化的web应用程序中使用。例如,根据上下文环境注册属性源或激活概要文件

2、认识ApplicationContextInitializer接口

ApplicationContextInitializer接口只有一个方法,实现该方法会获得一个ConfigurableApplicationContext的回调。

@FunctionalInterface
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {void initialize(C applicationContext);}

3、ApplicationContextInitializer的常用用法

(1)注册BeanFactoryPostProcessor

在这里插入图片描述

(2)注册ApplicationListener监听器

在这里插入图片描述

(3)处理Environment运行环境(获取、修改配置等)

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

(4)设置ApplicationContext的parent

在这里插入图片描述

(5)注册Bean

在这里插入图片描述

(6)注册BeanPostProcessor

在这里插入图片描述

二、使用ApplicationContextInitializer

1、定义ApplicationContextInitializer实现类

public class FirstInitializer implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> map = new HashMap<>();map.put("key1", "First");MapPropertySource mapPropertySource = new MapPropertySource("firstInitializer", map);environment.getPropertySources().addLast(mapPropertySource);System.out.println("run firstInitializer");}}public class SecondInitializer implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> map = new HashMap<>();map.put("key1", "Second");MapPropertySource mapPropertySource = new MapPropertySource("secondInitializer", map);environment.getPropertySources().addLast(mapPropertySource);System.out.println("run secondInitializer");}}public class ThirdInitializer implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> map = new HashMap<>();map.put("key1", "Third");MapPropertySource mapPropertySource = new MapPropertySource("thirdInitializer", map);environment.getPropertySources().addLast(mapPropertySource);System.out.println("run thirdInitializer");}}

2、注册ApplicationContextInitializer

(1)在resources/META-INF/spring.factories配置

org.springframework.context.ApplicationContextInitializer=com.learn.springboot.initializer.FirstInitializer

(2)代码注册

SpringApplication springApplication = new SpringApplication(SpringbootApplication.class);
springApplication.addInitializers(new SecondInitializer());
springApplication.run();

(3)配置文件注册

context.initializer.classes=com.learn.springboot.initializer.ThirdInitializer

3、查看结果

可以看到配置生效了,并且三种配置优先级不一样,配置文件优先级最高,spring.factories 其次,代码最后。

run thirdInitializer
run firstInitializer
run secondInitializer

4、设置执行顺序

可以通过@Order或者实现org.springframework.core.Ordered接口并重写setOrder方法设置顺序,@Order 值越小,执行优先级越高。

三、源码分析

springboot启动流程,手把手打断点一步步看运行步骤

1、加载ApplicationContextInitializer

在Springboot启动时,会加载所有META-INF/spring.factories中定义的ApplicationContextInitializer
在这里插入图片描述
如果用SpringApplication的addInitializers方法添加,相当于直接添加到这个List中:
在这里插入图片描述

2、执行时机

在springboot启动,调用prepareContext方法时:
在这里插入图片描述
在这里插入图片描述
所以说,initialize方法是在IOC容器启动之前执行的,此时的容器还未初始化,只能做一些容器启动前的准备工作。

参考资料

https://zhuanlan.zhihu.com/p/509824476
https://mp.weixin.qq.com/s/_kTPz22QY9fZXmyYtE-Ulw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498499.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用OpenArk查看Windows 11电脑中全部快捷键并解决热键冲突问题

本文介绍在Windows电脑中&#xff0c;基于OpenArk工具&#xff0c;查看电脑操作系统与所有软件的快捷键&#xff0c;并对快捷键冲突加以处理的方法。 最近&#xff0c;发现有道词典的双击Ctrl功能失效了&#xff0c;不能很方便地翻译界面中的英语&#xff1b;所以&#xff0c;就…

从 0 到 1 搭建亿级商品 ES 搜索引擎

建设并维护一个亿级的搜索引擎并非易事&#xff0c;也不存在一劳永逸的最优治理方法。本文是在实践中不断学习和总结的成果&#xff0c;介绍了如何搭建一个可支持从千万级到亿级商品量级的搜索系统&#xff0c;并实现查询总 QPS 从百级增长到千级&#xff0c;写入总 QPS 从百级…

15:00面试,15:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

js获取地理位置并记录

正常情况下&#xff0c;一般都是通过请求时附带的ip给后端&#xff0c;然后再通过ip解析出客户端访问所在的地理位置&#xff0c;那么&#xff0c;如果不通过ip呢。让用户手动授权允许访问客户端的位置&#xff0c;以此获取地址位置精度更高。 不知你们在访问一些网站时&#x…

Leetcode : 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;最开始排序算法&…

小白水平理解面试经典题目leetcode 606. Construct String from Binary Tree【递归算法】

Leetcode 606. 从二叉树构造字符串 题目描述 例子 小白做题 坐在自习室正在准备刷题的小白看到这道题&#xff0c;想想自己那可是没少和白月光做题呢&#xff0c;也不知道小美刷题刷到哪里了&#xff0c;这题怎么还没来问我&#xff0c;难道是王谦谦去做题了&#xff1f; 这…

C语言实现21点游戏【单人模式,双人模式,单-多电脑模式】,21点又名黑杰克(英文:Blackjack)

项目背景&#xff1a; 21点又名黑杰克&#xff08;英文&#xff1a;Blackjack&#xff09; &#xff0c;起源于法国&#xff0c;已流传到世界各地。21点&#xff0c;是一种使用扑克牌玩的赌博游戏。亦是唯一一种在赌场中可以在概率中战胜庄家的一种赌博游戏。 现在在世界各地…

【机器学习】特征选择之包裹式特征选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

深入浅出HTML网页结构:构建您的第一个网页

深入浅出HTML网页结构&#xff1a;构建您的第一个网页 在之前的文章中&#xff0c;我们探索了HTML的奥秘&#xff0c;学习了基础标签的使用。本文将带您一步步构建自己的第一个网页&#xff0c;从零开始&#xff0c;让复杂的HTML结构变得简单易懂。 一、引言 HTML&#xff0c;…

【软件设计师】多元化多方面了解多媒体技术的内容

&#x1f413; 多媒体技术基本概念 多媒体主要是指文字、声音和图像等多种表达信息的形式和媒体&#xff0c;它强调多媒体信息的综合和集成处理。多媒体技术依赖于计算机的数字化和交互处理能力&#xff0c;它的关键是信息压缩技术和光盘存储技术。 亮度 亮度是光作用于人眼时所…

ISP代理是什么?跨境账号养号为什么要选择它?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

飞天使-学以致用-devops知识点3-安装jenkins

文章目录 构建带maven环境的jenkins 镜像安装jenkinsjenkins yaml 文件安装插件jenkins 配置k8s创建用户凭证 构建带maven环境的jenkins 镜像 # 构建带 maven 环境的 jenkins 镜像 docker build -t 192.168.113.122:8858/library/jenkins-maven:jdk-11 .# 登录 harbor docker …