千家信息网

SpringBoot的EnvironmentPostProcessor怎么用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天小编给大家分享一下SpringBoot的EnvironmentPostProcessor怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,
千家信息网最后更新 2026年10月31日SpringBoot的EnvironmentPostProcessor怎么用

今天小编给大家分享一下SpringBoot的EnvironmentPostProcessor怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、背景

    之前项目中用到了Apollo配置中心,对接Apollo配置中心后,配置中心的属性就可以在程序中使用了,那么这个是怎么实现的呢?配置中心的属性又是何时加载到程序中的呢?那么我们如果找到了这个是怎么实现的是否就可以 从任何地方加载配置属性、配置属性的加解密功能呢?

    二、需求

    从上图中得知,我们的需求很简单,即我们自己定义的属性需要比配置文件中的优先级更高。

    三、分析

    1、什么时候向SpringBoot中加入我们自己的配置属性

    当我们想在Bean中使用配置属性时,那么我们的配置属性必须在Bean实例化之前就放入到Spring到Environment中。即我们的接口需要在 application context refreshed 之前进行调用,而 EnvironmentPostProcessor 正好可以实现这个功能。

    2、获取配置属性的优先级

    我们知道在 Spring中获取属性是有优先级的。
    比如我们存在如下配置属性 username

    ├─application.properties│   >> username=huan├─application-dev.properties│   >> username=huan.fu

    那么此时 username 的值是什么呢?此处借用 Apollo的一张图来说解释一下这个问题。

    参考链接:https://www.apolloconfig.com/#/zh/design/apollo-design

    Spring从3.1版本开始增加了ConfigurableEnvironment和PropertySource:

    ConfigurableEnvironment
    • Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)

    • ConfigurableEnvironment自身包含了很多个PropertySource

    PropertySource

    • 属性源

    • 可以理解为很多个Key - Value的属性配置

    由上方的原理图可知,key在最开始出现的PropertySource中的优先级更高,上面的例子在SpringBoot中username的值为huan.fu。

    3、何时加入我们自己的配置

    由第二步 获取配置属性的优先级 可知,PropertySource 越靠前越先执行,那么要我们配置生效,就必须放在越前面越好。

    由上图可知,SpringBoot加载各种配置是通过EnvironmentPostProcessor来实现的,而具体的实现是ConfigDataEnvironmentPostProcessor来实现的。那么我们自己编写一个EnvironmentPostProcessor的实现类,然后在ConfigDataEnvironmentPostProcessor后执行,并加入到 Environment中的第一位即可。

    四、实现

    1、引入SpringBoot依赖

        4.0.0            org.springframework.boot        spring-boot-starter-parent        2.6.6                 com.huan.springcloud    springboot-extension-point    0.0.1-SNAPSHOT    springboot-extension-point            1.8                            org.springframework.boot            spring-boot-starter-web            

    2、在application.properties中配置属性

    vim application.properties
    username=huan

    3、编写自定义属性并加入Spring Environment中

    注意:
    1、如果发现程序中日志没有输出,检查是否使用了slf4j输出日志,此时因为日志系统未初始化无法输出日志。解决方法如下:

    SpringBoot版本                >= 2.4 可以参考上图中的使用 DeferredLogFactory 来输出日志                < 2.4                        1、参考如下链接 https://stackoverflow.com/questions/42839798/how-to-log-errors-in-a-environmentpostprocessor-execution                        2、核心代码:                                @Component                                public class MyEnvironmentPostProcessor implements                                        EnvironmentPostProcessor, ApplicationListener {                                    private static final DeferredLog log = new DeferredLog();                                    @Override                                    public void postProcessEnvironment(                                            ConfigurableEnvironment env, SpringApplication app) {                                        log.error("This should be printed");                                    }                                    @Override                                    public void onApplicationEvent(ApplicationEvent event) {                                        log.replayTo(MyEnvironmentPostProcessor.class);                                    }                                }

    4、通过SPI使自定义的配置生效

    1、在 src/main/resources下新建META-INF/spring.factories文件

    2、配置

    org.springframework.boot.env.EnvironmentPostProcessor=\  com.huan.springcloud.extensionpoint.environmentpostprocessor.CustomEnvironmentPostProcessor

    5、编写测试类,输出定义的 username 属性的值

    @Componentpublic class PrintCustomizeEnvironmentProperty implements ApplicationRunner {    private static final Logger log = LoggerFactory.getLogger(PrintCustomizeEnvironmentProperty.class);    @Value("${username}")    private String userName;    @Override    public void run(ApplicationArguments args) {        log.info("获取到的 username 的属性值为: {}", userName);    }}

    6、运行结果

    五、注意事项

    1、日志无法输出

    参考上方的 3、编写自定义属性并加入Spring Environment中提供的解决方案。

    2、配置没有生效检查

    • 检查EnvironmentPostProcessor的优先级,看看是否@Order或者Ordered返回的优先级值不对。

    • 看看别的地方是否实现了 EnvironmentPostProcessor或ApplicationContextInitializer或BeanFactoryPostProcessor或BeanDefinitionRegistryPostProcessor等这些接口,在这个里面修改了 PropertySource的顺序。

    • 理解 Spring 获取获取属性的顺序 参考 2、获取配置属性的优先级

    3、日志系统如何初始化

    如下代码初始化日志系统

    org.springframework.boot.context.logging.LoggingApplicationListener

    以上就是"SpringBoot的EnvironmentPostProcessor怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

    配置 属性 优先级 日志 参考 输出 知识 篇文章 上图 接口 程序 系统 检查 代码 内容 功能 地方 文件 版本 链接 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技产业 深圳恒合互联网络科技有限公司 互联网金融 科技金融 深圳互联网络科技有限公司 亿策互联网科技 鑫亿盛互联网科技 奇士达互联网科技 新浪科技互联网 科技互联网创业计划书 开启互联网科技时代小说 北京华百购互联网科技有限公司 顶级互联网科技成果有哪些 互联网科技公司实习生 注册互联网科技公司经营范围大全 民营互联网公司国防科技 世界互联网领先科技成果获奖 互联网科技数字货币 广州互联网高科技取餐柜 第三届互联网大会安防黑科技 伍佰万互联网科技是干嘛的 互联网科技工作委员会副主任毛军 科技互联网龙头 成都互联网科技公司 撒么互联网科技公司 科技互联网创业计划书 广西拼得多互联网科技有限公司 中和天地互联网科技有限公司 互联网第三次科技革命特征 扫呗互联网科技有限公司 宁波跨境商互联网科技有限公司
    0