0

0

SpringBoot的EnvironmentPostProcessor怎么用

PHPz

PHPz

发布时间:2023-05-22 09:25:05

|

2426人浏览过

|

来源于亿速云

转载

    一、背景

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

    二、需求

    SpringBoot的EnvironmentPostProcessor怎么用

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

    三、分析

    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

    SpringBoot的EnvironmentPostProcessor怎么用

    Spring从3.1版本开始增加了ConfigurableEnvironmentPropertySource

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

    • ConfigurableEnvironment自身包含了很多个PropertySource

    PropertySource

    • 属性源

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

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

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

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

    SpringBoot的EnvironmentPostProcessor怎么用

    塔可商城
    塔可商城

    塔可商城, 一个基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序、管理后台,后端服务的项目,它内置提供了会员分销, 区域代理, 商品零售等功能的新零售电商系统。强大弹性的架构设计,简洁的代码,最新的技术栈,全方面适合不同需求的前端,后端,架构的同学,同时更是企业开发需求的不二选择。 项目结构通过项目结构,你将清楚明白你即将入手的是一个怎么样的项目,你可能需要什么,如何

    下载

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

    SpringBoot的EnvironmentPostProcessor怎么用

    四、实现

    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中

    SpringBoot的EnvironmentPostProcessor怎么用

    注意:
    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文件

    SpringBoot的EnvironmentPostProcessor怎么用

    2、配置

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

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

    @Component
    public 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、运行结果

    SpringBoot的EnvironmentPostProcessor怎么用

    五、注意事项

    1、日志无法输出

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

    2、配置没有生效检查

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

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

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

    3、日志系统如何初始化

    如下代码初始化日志系统

    org.springframework.boot.context.logging.LoggingApplicationListener

    相关专题

    更多
    视频文件格式
    视频文件格式

    本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

    2

    2025.12.31

    不受国内限制的浏览器大全
    不受国内限制的浏览器大全

    想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

    6

    2025.12.31

    出现404解决方法大全
    出现404解决方法大全

    本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

    16

    2025.12.31

    html5怎么播放视频
    html5怎么播放视频

    想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

    3

    2025.12.31

    关闭win10系统自动更新教程大全
    关闭win10系统自动更新教程大全

    本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

    2

    2025.12.31

    阻止电脑自动安装软件教程
    阻止电脑自动安装软件教程

    本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

    1

    2025.12.31

    html5怎么使用
    html5怎么使用

    想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

    2

    2025.12.31

    php如何本地部署教程
    php如何本地部署教程

    想在本地搭建PHP开发环境?本合集提供2025最新PHP本地部署详细教程,涵盖Windows、macOS、Linux三大系统,手把手教你安装Apache/Nginx、MySQL、PHP(AMP/LAMP/WAMP集成环境),配置虚拟主机、开启扩展、调试错误等关键步骤。无需联网依赖,快速构建高效本地开发环境,新手也能轻松上手!

    2

    2025.12.31

    小游戏4399大全
    小游戏4399大全

    4399小游戏免费秒玩大全来了!无需下载、即点即玩,涵盖动作、冒险、益智、射击、体育、双人等全品类热门小游戏。经典如《黄金矿工》《森林冰火人》《狂扁小朋友》一应俱全,每日更新最新H5游戏,支持电脑与手机跨端畅玩。访问4399小游戏中心,重温童年回忆,畅享轻松娱乐时光!官方入口安全绿色,无插件、无广告干扰,打开即玩,快乐秒达!

    35

    2025.12.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Redis6入门到精通超详细教程
    Redis6入门到精通超详细教程

    共47课时 | 5.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号