返回顶部
首页 > 资讯 > 精选 >SpringBoot容器刷新前怎么回调ApplicationContextInitializer
  • 401
分享到

SpringBoot容器刷新前怎么回调ApplicationContextInitializer

2023-07-04 20:07:59 401人浏览 独家记忆
摘要

本篇内容介绍了“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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: SpringBoot容器刷新前怎么回调ApplicationContextInitializer

本文链接: https://lsjlt.com/news/347318.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot容器刷新前回调ApplicationContextInitializer
    目录引言I. 项目准备II. 容器刷新前扩展点实例1. 自定义ApplicationContextInitializer2. 扩展点注册3. 执行顺序指定4. 使用场景示例5. 小结...
    99+
    2022-12-21
    SpringBoot ApplicationContextInitializer SpringBoot 容器刷新回调
  • SpringBoot容器刷新前怎么回调ApplicationContextInitializer
    本篇内容介绍了“SpringBoot容器刷新前怎么回调ApplicationContextInitializer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅...
    99+
    2023-07-04
  • vue3中怎么刷新当前页面
    这篇“vue3中怎么刷新当前页面”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3中怎么刷新当前页面”文章吧。1.业务场...
    99+
    2023-07-05
  • HTML5怎么无刷新改变当前url
    这篇文章将为大家详细讲解有关HTML5怎么无刷新改变当前url,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。window.history.back();//后退windo...
    99+
    2024-04-02
  • vue项目怎么刷新当前页面
    这篇文章将为大家详细讲解有关vue项目怎么刷新当前页面,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。场景在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页...
    99+
    2024-04-02
  • vue不刷新当前页面怎么办
    本教程操作环境:Windows10系统、Vue 3版、Dell G3电脑。vue不刷新当前页面怎么办?vue项目中数据更新页面不刷新问题这种情况可以分为很多种.但是究其原因就是vue3.0以下版本无法监听对象(包括数组以及对象)的变化,当数...
    99+
    2023-05-14
    Vue
  • SpringBoot详细讲解如何创建及刷新Spring容器bean
    目录一、前期准备1.1 创建工程1.2 创建Controller二、探究过程2.1 启动类2.2 SpringApplication2.3 ApplicationContextFac...
    99+
    2024-04-02
  • SpringBoot怎么实时刷新静态文件
    小编给大家分享一下SpringBoot怎么实时刷新静态文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!方案Spring Boot在MVC中有个WebMvcProperties的配置类,还有个ResourcePropert...
    99+
    2023-06-22
  • springboot自动刷新配置怎么实现
    在Spring Boot中,可以通过使用Spring Cloud Config或Spring Boot Actuator来实现自动刷...
    99+
    2023-10-10
    springboot
  • win11刷新率只有60怎么调整
    在Windows 11中调整刷新率的方法如下:1. 点击任务栏右下角的通知图标,打开“操作中心”。2. 在“操作中心”中,找到并点击...
    99+
    2023-09-08
    win11
  • 亚马逊刷新服务器异常怎么回事
    1. 什么是亚马逊刷新服务器? 亚马逊刷新服务器是指亚马逊网站上的一种服务,它可以帮助用户刷新他们的产品页面,以便在亚马逊网站上显示最新的信息。这个服务通常用于在线销售和电子商务网站,以确保客户能够看到最新的产品信息和价格。 2. 亚马逊...
    99+
    2023-10-27
    亚马逊 怎么回事 异常
  • ajax怎么刷新div下的jsp内容
    本篇内容介绍了“ajax怎么刷新div下的jsp内容”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 浅析vue中怎么刷新当前页面
    vue怎么刷新当前页面?下面本篇文章给大家介绍一下vue刷新当前页面的几种实现方法,希望对大家有所帮助!项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面.思路(1)如果页面简单,调用接口刷新数据即可.(2)如果...
    99+
    2023-05-14
    前端 Vue.js JavaScript
  • php怎么实现返回不刷新页面
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php怎么实现返回不刷新页面?PHP实现返回上一页不刷新 和刷新的方法返回上一页不刷新:echo"<script>alert('已从错题本中...
    99+
    2018-11-23
    php
  • react路由返回时不刷新怎么办
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react路由返回时不刷新怎么办?react 跳转后路由变了页面没刷新的解决方案最近在学习React的过程中遇到了路由跳转后页面不刷新的问题,本文就详细的...
    99+
    2023-05-14
    React
  • Spring容器刷新obtainFreshBeanFactory的方法是什么
    本篇内容主要讲解“Spring容器刷新obtainFreshBeanFactory的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring容器刷新obtainFreshBeanFa...
    99+
    2023-07-05
  • Spring容器刷新prepareRefresh第一步是什么
    本篇内容介绍了“Spring容器刷新prepareRefresh第一步是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面是这部分的涉及...
    99+
    2023-07-05
  • 亚马逊刷新服务器地址错误怎么回事
    网络故障:网络可能无法连接到亚马逊的服务器,导致无法访问。 服务器配置问题:服务器可能配置有误,导致无法访问。 DNS问题:亚马逊的服务器可能被攻击者劫持,导致DNS查找出现问题。 账户安全问题:如果用户的账户存在安全问题,可能被黑客攻击...
    99+
    2023-10-27
    亚马逊 怎么回事 错误
  • Ajax回退刷新页面问题怎么解决
    本篇内容介绍了“Ajax回退刷新页面问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Ajax 简...
    99+
    2024-04-02
  • uniapp怎么跳转回上一页并刷新页面
    Uniapp是一个基于Vue.js框架开发的跨平台移动应用开发框架,在开发过程中,我们经常会遇到需要跳转到上一页并刷新页面的需求,本篇文章将介绍如何实现这一功能。一、前置知识在实现跳转回上一页并刷新页面的过程中,需要使用到两个API:uni...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作