相信大部分人都有这样一个类,专用来放静态常量,在整个项目过程中基本不会变,但却被各个业务类引用。如下图是我们项目中的常量类。
但是现在有一个问题,需要和其他各个平台对接,其中该常量类大部分属性都需要切换到相对应的数据。比如里面大部分 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/