Spring boot灵活切换配置文件,static静态变量配置文件读取

相信大部分人都有这样一个类,专用来放静态常量,在整个项目过程中基本不会变,但却被各个业务类引用。如下图是我们项目中的常量类。

但是现在有一个问题,需要和其他各个平台对接,其中该常量类大部分属性都需要切换到相对应的数据。比如里面大部分 appid 和 secret 都要切换到相应平台的数据。

我们怎么做呢?复制 A 平台一份一模一样命名的属性,放在下面,然后修改成 B 平台对应的数据,注释上面 A 平台数据。来回操作几次,感觉有点 low ,有什么好办法没?

写到配置文件 application.yml 中,这样切换配置文件就行了。这里涉及到两个知识点:

  • 激活指定配置文件
  • 静态变量配置化

读取指定配置文件 application.yml

在项目中我们一般会有两种环境:测试环境和正式环境。这两种环境很多配置不一样,比如运行端口、数据库配置等等。如果总是来回修改切换,麻烦是小事,还有可能忘记,导致报错怎么也找不到原因(亲身体验)。

所以为了一劳永逸,最好的做法是什么呢?建立两套或者多套配置文件,然后去灵活读取。

根据我这里实际情况,有多个平台,这里就建立多个平台的配置文件,然后配置相应参数。比如,我创建三个文件

application-delib.yml  、application-zhike.yml 和  application.yml

前面两者就是相应平台的各自参数,mysql、redis、IP、Port 等等。下面在application.yml激活读取。比如这里我要读取 delib 的数据。同理可知其他写法。

spring:
    profiles:
      active:
          - delib

好的,到这就搞定前奏,将本身就在配置文件中的数据拆分灵活读取。现在将 static静态类的属性也写到配置文件中,然后读取。

static静态属性 @value配置

比如我在静态类中有这样一条属性

public static final String appID = "123456";

首先将静态常量修改成静态变量,去掉修饰符 final ,当然如果你的属性本身就没有用 final 修饰就另说。这里要说明如果你的属性本身也没用 static 修饰。 这就比较简单了,在属性上用 @value 注解就是了,很多实体类bean经常就是这种做法,这不讨论了,比较简单。

这的难点在于,我的属性要用 static 修饰。但是 static 不能和注解并用。相信大家在写代码过程中都或多或少碰到过如下几种情况,运行都是会报错的。

@Autowired
private static OrderMapper orderMapper;
@Value("${appID}")
public static final String appID = "123456";

解决办法就是注解改属性的 set 方法。方法同样不能带 static ,原因如上。

  public static  String appID = "";
  
  @Value("${appID}")
  public void setAppID(String mappID) {
  	appID = mappID;
  }

同时将值写到配置文件中

appID: 123456

还要记得将整个类作为组件放到 Spring 容器中,让 Spring 管理,也就是用 @Component 注解存放属性的类,也就是我这图片中的 AppContants 。

这样就大功告成,在其他地方调用 AppContants .appID 就能读取到配置文件中的 123456 。

好的,如果帮到你,请点个赞支持额~

 

 

本文由老郭种树原创,转载请注明:https://guozh.net/spring-boot-change-application-config-yml/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注