我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

本篇内容介绍了“SpringBoot容器刷新前怎么回调ApplicationContextInitializer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

I. 项目准备

本文创建的实例工程采用SpringBoot 2.2.1.RELEASE + maven 3.5.3 + idea进行开发

具体的SpringBoot项目工程创建就不赘述了,核心的pom文件,无需额外的依赖

配置文件 application.yml, 也没有什么特殊的配置

II. 容器刷新前扩展点实例

1. 自定义ApplicationContextInitializer

当我们希望实现一个自定义的上下文初始化时,非常简单,实现上面这个接口就行了,如

public class ApplicationContextInitializer01 implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        System.out.println("ApplicationContextInitializer01");    }}

2. 扩展点注册

上面自定义一个扩展点,如何使它生效呢?

官方提供了三种方式,如在启动时,直接进行注册: springApplication.addInitializers(new ApplicationContextInitializer01());

@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication springApplication = new SpringApplication(Application.class);        springApplication.addInitializers(new ApplicationContextInitializer01());        try (ConfigurableApplicationContext context = springApplication.run(args)) {        }    }}

当我们的扩展点是放在一个jar包中对外提供时,使用上面的启动注册方式显然是不可行的,此时更推荐的做法就是通过Spring的SPI机制进行注册

在资源目录下的META-INF/spring.factories文件中进行注册

org.springframework.context.ApplicationContextInitializer=com.git.hui.extention.context.ApplicationContextInitializer02

说明

  • 上面SPI的机制非常推荐大家使用,在之前的文章中,AutoConfiguration的注册通常也是使用这种方式

除了上面的两种注册方式之外,另外还有一个配置文件的方式,在配置文件application.propertiesapplication.yml中,如下配置

context:  initializer:    classes: com.git.hui.extention.context.ApplicationContextInitializer03

启动测试

上面三种注册方式,我们实现三个自定义的扩展点,然后启动之后,看一下实际输出

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

上面的输出,可以简单的得出一个结论,不同注册方式的优先级(为了更合理的验证下面的观点,推荐大家修改下上面三个自定义扩展点名,排除掉是因为扩展名导致的排序问题)

  • 配置文件注册 > SPI注册 > 启动时注册

3. 执行顺序指定

对于自定义的扩展点实现,当存在顺序关系时,我们可以通过@Order注解来实现, 如当上面的三个扩展点都是通过启动方式注册时

@Order(5)public class ApplicationContextInitializer01 implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        System.out.println("ApplicationContextInitializer01");    }}@Order(2)public class ApplicationContextInitializer02 implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        System.out.println("ApplicationContextInitializer02");    }}@Order(10)public class ApplicationContextInitializer03 implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        System.out.println("ApplicationContextInitializer03");    }}@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication springApplication = new SpringApplication(Application.class);        springApplication.addInitializers(new ApplicationContextInitializer01(), new ApplicationContextInitializer02(), new ApplicationContextInitializer03());        try (ConfigurableApplicationContext context = springApplication.run(args)) {        }    }}

输出实例如下

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

接着重点来了

  • 若上面的三个自定义实现,不是相同的注册方式,如将03采用配置文件方式进行注册,那么01, 02 依然是启动注册

  • 则顺序是 03 > 02 > 01

  • @Order注解修饰的顺序,并不能打破 配置文件 > SPI > 启动方式注册的顺序

关于自定义实现类的执行顺序,规则如下

  • 配置文件 > SPI > 启动方式

  • 相同的注册方式,可以通过 @Order 注解进行修饰,值越小则优先级越高

4. 使用场景示例

最后我们再来看一下,这个扩展点到底有什么用,我们再什么场景下会用到这个呢?

一个经常可以看到的应用场景如通过它来指定需要激活的配置文件

public class ApplicationContextInitializer03 implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        // 指定激活prod对应的配置文件        configurableApplicationContext.getEnvironment().setActiveProfiles("prod");    }}

但是一般也很少见到有人这么干,因为直接使用配置参数就行了,那么有场景需要这么做么?

答案当然是有的,比如现在广为流行的docker容器部署,当我们希望每次都是打同一个镜像,然后在实际运行的时候,根据不同的环境来决定当前镜像到底启用哪些配置文件,这时就有用了

比如我们通过容器的环境参数 app.env 来获取当前运行的环境,如果是prod,则激活application-prod.yml; 如果是test,则激活application-test.yml

那么此时可以这么干

public class EenvActiveApplicationContextInitializer implements ApplicationContextInitializer {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        String env = System.getenv("app.env");        if ("prod".equalsIgnoreCase(env)) {            configurableApplicationContext.getEnvironment().setActiveProfiles("prod");        } else if ("test".equalsIgnoreCase(env)) {            configurableApplicationContext.getEnvironment().setActiveProfiles("test");        } else {            throw new RuntimeException("非法的环境参数:" + env);        }    }}

“SpringBoot容器刷新前怎么回调ApplicationContextInitializer”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot容器刷新前回调ApplicationContextInitializer

这篇文章主要为大家介绍了SpringBoot容器刷新前回调ApplicationContextInitializer使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-21

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

本篇内容介绍了“SpringBoot容器刷新前怎么回调ApplicationContextInitializer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
2023-07-04

亚马逊刷新服务器异常怎么回事

1.什么是亚马逊刷新服务器?亚马逊刷新服务器是指亚马逊网站上的一种服务,它可以帮助用户刷新他们的产品页面,以便在亚马逊网站上显示最新的信息。这个服务通常用于在线销售和电子商务网站,以确保客户能够看到最新的产品信息和价格。2.亚马逊刷新服务器异常的原因亚马逊刷新服务器异常可能有多种原因,以下是一些可能的原因:2.1服务器故障亚马逊刷新服务器可能会出现故障,导致无法正常工作。这可能是由于硬件故障、软件故障或网...
2023-10-27

亚马逊刷新服务器地址错误怎么回事

网络故障:网络可能无法连接到亚马逊的服务器,导致无法访问。服务器配置问题:服务器可能配置有误,导致无法访问。DNS问题:亚马逊的服务器可能被攻击者劫持,导致DNS查找出现问题。账户安全问题:如果用户的账户存在安全问题,可能被黑客攻击,导致无法访问。为了解决这些问题,可以尝试使用其他浏览器或重新启动计算机,或联系亚马逊客服寻求帮助。
2023-10-27

亚马逊服务器容量变大了怎么调节回来

增加服务器数量:可以通过增加服务器数量来提高服务器的容量,但需要注意的是,增加服务器数量会增加成本和运营风险,因此需要综合考虑。升级硬件:如果某些硬件设备可能无法满足新的需求,可以考虑升级硬件设备来提高容量,但需要注意设备的兼容性和安全性。分布式部署:将大量的服务器分布在多个地方,可以将它们看作是一台台小型计算机,这样可以降低单个服务器的负载,提高容量。限制使用空间:可以将一些非关键业务服务限制在...
2023-10-27

亚马逊服务器容量变大了怎么调整回来呢

以下是一些调整服务器容量以返回原始容量的方法:增加内存:如果您的网站或应用程序需要更多内存,那么您可以考虑增加内存。您可以使用RAM扩展或外部RAM扩展来增加内存。增加硬盘驱动器容量:如果您的网站或应用程序需要更多硬盘驱动器,那么您可以增加硬盘驱动器的容量。使用分区:您可以使用分区工具或分区格式来创建更多的磁盘分区,从而扩大服务器的容量。增加网络带宽:如果您的网站或应用程序需要更多网络带宽,那么您...
2023-10-27

亚马逊服务器容量变大了怎么调回来啊苹果14pro

打开iCloud并登录您的AleID。点击“查看iCloud照片库”。找到您上次使用的iCloud备份,并点击它。在新页面上,您将看到一个“容量”选项,您可以选择容量大小以重新恢复容量。请注意,更改iCloud备份容量将影响您的设备和iCloud存储容量。如果您的设备容量超过限制,则可能无法访问和使用新的iCloud备份容量。
2023-10-27

怎么用Meta取消流量器缓存实现每次访问都刷新页面方便调试

这篇文章主要介绍“怎么用Meta取消流量器缓存实现每次访问都刷新页面方便调试”,在日常操作中,相信很多人在怎么用Meta取消流量器缓存实现每次访问都刷新页面方便调试问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录