Spring Boot 使用 EnvironmentPostProcessor 接口实现加载外部配置文件

从Spring Boot 1.3开始,我们可以在应用程序上下文刷新之前使用 EnvironmentPostProcessor来自定义应用程序的 EnvironmentEnvironment表示当前应用程序运行的环境,它可以统一访问各种属性源中的属性,如属性文件、JVM系统属性、系统环境变量和Servlet上下文参数。使用 EnvironmentPostProcessor可以在bean初始化之前对 Environment进行修改。

示例

在 custom.properties 中定义一些配置,配置如下:

jdbc.root.user=mysql
jdbc.root.password=123456

1.实现EnvironmentPostProcessor

定义MyEnvironmentPostProcessor实现EnvironmentPostProcessor接口

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        try{
            InputStream inputStream = new FileInputStream("/Users/SpringBoot/custom.properties");
            Properties properties = new Properties();
            properties.load(inputStream);
            PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource("my",properties);
            environment.getPropertySources().addLast(propertiesPropertySource);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

}

如果你希望EnvironmentPostProcessor按照特定的顺序被调用,可以实现Ordered接口,或者使用@Order注解。

2.注册实现类

想要在Spring Boot启动过程中调用这个实现类,我们还需要在项目的resources目录中定义一个META-INF文件夹,然后在其下面先建spring.factories文件,在其中指定注册这个实现类:

org.springframework.boot.env.EnvironmentPostProcessor=com.test.springboot.processor.MyEnvironmentPostProcessor

3.测试

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        String username = context.getEnvironment().getProperty("jdbc.root.user");
        String password = context.getEnvironment().getProperty("jdbc.root.password");
        System.out.println("username==="+username);
        System.out.println("password==="+password);
    }
}

EnvironmentPostProcessor接口官网说明

官方文档如下

Allows for customization of the application’s {@link Environment} prior to the application context being refreshed.

允许定制应用的上下文的应用环境优于应用的上下文之前被刷新。(意思就是在spring上下文构建之前可以设置一些系统配置)

EnvironmentPostProcessor implementations have to be registered in
META-INF/spring.factories, using the fully qualified name of this class as the key.

EnvironmentPostProcessor的实现类必须要在 META-INF/spring.factories文件中去注册,并且注册的是全类名。

EnvironmentPostProcessor processors are encouraged to detect whether Spring’s
org.springframework.core.Ordered Ordered interface has been implemented or if the @org.springframework.core.annotation.Order Order annotation is present and to sort instances accordingly if so prior to invocation.

鼓励EnvironmentPostProcessor处理器检测 Org.springframework.core.Ordered注解,这样相应的实例也会按照@Order注解的顺序去被调用。

Original: https://www.cnblogs.com/rinack/p/15156742.html
Author: 如.若
Title: Spring Boot 使用 EnvironmentPostProcessor 接口实现加载外部配置文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540443/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • nginx解决跨域

    摘自:https://juejin.cn/post/6844903942262882318#comment 跨域问题 跨域的定义 同源策略限制了从同一个源加载的文档或脚本如何与来自…

    Java 2023年5月30日
    068
  • Git、TortoiseGit中文安装教程,如何注册Gitee账号进行代码提交,上传代码后主页贡献度没显示绿点(详解)

    今天给大家分享的是 Git 软件和 TortoiseGit 图形化软件的详细安装教程以及如何在 gitee 上进行代码提交。 首先我也是个刚接触 gitee 的一个小白用户,这些都…

    Java 2023年6月15日
    085
  • Redis6.0.6的三大内存过期策略和八大淘汰策略

    一、前言 Redis在我们日常开发中是经常用到的,Redis也是功能非常强大,可以进行缓存,还会有一些排行榜、点赞、消息队列、购物车等等;当然还有 分&amp…

    Java 2023年6月15日
    068
  • JAVA中文件写入的6种方法

    在 Java 中操作文件的方法本质上只有两种:字符流和字节流,而字节流和字符流的实现类又有很多,因此在文件写入时我们就可以选择各种各样的类来实现。我们本文就来盘点一下这些方法,顺便…

    Java 2023年5月29日
    063
  • 六、IDEA安装

    一、IDEA下载与安装 1.1、下载IDEA安装包 博主在这里给大家准备了一个64位操作系统的IDEA以便大家下载(使用的是迅雷)点击此处下载提取码:dgiy 如果其他小伙伴的电脑…

    Java 2023年6月5日
    090
  • Java开发笔记(一百五十四)StringBuffer和StringBuilder的由来

    本来String类已经能够完成字符串操作的所有功能,为何Java又提供了专门的StringBuffer和StringBuilder呢?这要从String类的设计说起了,查看Stri…

    Java 2023年6月6日
    076
  • SpringCloud入门简述

    1、微服务简述 ​ 微服务,是一个小型的服务,也是一种设计理念,将一个大型繁杂的系统拆分为多个小型的服务,进行独立部署,这些服务在独立进程中运行,通过特定的协议进行通信 ​ 优点:…

    Java 2023年6月13日
    077
  • Java是一门强类型语言

    数据类型 语言类型 强类型语言 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 java的数据类型 1 基本类型(primitive type)2 引用类…

    Java 2023年6月9日
    077
  • 电容消耗速度

    package com.dong.mytest.demo.other.yan.dianrong; public class DianRongTest { private stati…

    Java 2023年6月5日
    074
  • SpringBoot接口-如何生成接口文档之非侵入方式(通过注释生成)Smart-Doc?

    通过Swagger系列可以快速生成API文档,但是这种API文档生成是需要在接口上添加注解等,这表明这是一种侵入式方式; 那么有没有非侵入式方式呢, 比如通过注释生成文档? 本文主…

    Java 2023年6月6日
    079
  • 优秀体现在细微处

    上面是团队内小王同学整理的需求评审计划,我们看最后一列的细节之处,即,加上了与这个需求相关的资料。 希望我们都能像上面的小王同学一样。 我们的信息,从不同角度来看,总会分散在不同的…

    Java 2023年6月15日
    073
  • 《HDFS源码剖析》–初品ing

    HDFS概述 ​ HDFS是Hadoop 分布式文件系统,可以运行在通用硬件上、提供流式数据操作、能够处理超大文件的分布式文件系统。HDFS具有高度容错、高吞吐量、容易扩展、高可靠…

    Java 2023年6月8日
    069
  • MarkDown Day001

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/shiguangzheng/p/14750559.htm…

    Java 2023年6月14日
    086
  • spring中特殊赋值处理

    字面量赋值:之间调用value赋值就行 赋值null: 特殊符号赋值: 1. Original: https://www.cnblogs.com/bieyinan/p/166971…

    Java 2023年6月16日
    072
  • Java动态代理

    动态代理 代理:辅助对象处理一些操作,为对象的 行为做代理(明星的经纪人)。 动态代理调用方法的流程 走向代理 代理为方法额外做一些辅助工作 触发真正的对象方法执行 回到代理中,由…

    Java 2023年6月9日
    088
  • 同一台电脑生成多份ssh私钥和公钥,映射多个GitHub账号

    当我们使用 Git 进行代码版本控制时,经常出现一台电脑需要连接多个Git 账号的情况,此时需要在一台电脑上生成多份 ssh 私钥和密钥,同时映射多个 Git 账号;这里我们需要同…

    Java 2023年6月5日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球