一、背景
之前一直从事的是.net平台开发。公司技术转型为使用java语言开发。
在开发项目时,因为项目比较小且是初期项目,有些数据直接坐到配置里面。根据不同环境读取不同配置数据。
二、配置在哪里
参照公司其他java项目,都是配置在yml中。故,我也如此配置。配置如下:
配置内容:
partnerconfig:
clientId: 43093
accessKey: 04B05F95F9A7895FCA55C394E0FFD859A1FC3427
三、如何根据不同环境读取不同配置
网上有多重说法。后来选取了如下伪代码的写法:
@Data
@Configuration
@ConfigurationProperties(prefix = "partnerconfig")
public class PartnerInfoConfig {
//@Value("${clientId}")
private String clientId;
// @Value("${accessKey}")
private String accessKey;
}
注:这种写法,一方面可以在类上打上ConfigurationProperties注解,指定配置层级的前缀。这样的好处是,直接可以定义和配置key名称一样的字段。
四、如何使用
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private PartnerInfoConfig partnerInfoConfig;
/*
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SignatureVerificationInterceptor(partnerInfoConfig)).addPathPatterns("/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
在类中定义如下配置:
@Autowired
private PartnerInfoConfig partnerInfoConfig;
这样就可以获取到yml中的配置了。
那么如何控制读取不同环境的配置呢?只要修改application.yml中active的值即可。(值有:dev、local、prod、test)
spring:
profiles:
active: dev
后记
如上是最终实现的过程。但是在其过程中,遇到了不少需要注意的点。再次记录一下,方便后来者参考。
1、在写yml配置时,冒号之后的空格千万不能丢,否则,将读不出配置数据。ide也不会报错提醒。这真是个让人拍大腿的大坑。(ps:格式化代码时,idea为何不能自动留出空格。苦笑~)
两种写法案例比较:
#冒号后有空格
clientId: 43093
#冒号后没有空格
clientId:43093
2、在搜索资料时,发现有的人用的是properties配置,有的人是用yml配置。那两者有何区别和联系呢?看这个博文: 面试突击74:properties和yml有什么区别? - Java中文社群 - 博客园
推荐还是使用yml配置。
3、在自定义的HandlerInterceptor拦截器中,是没法直接定义配置类获取到配置数据的。需要从
WebMvcConfigurer实现类中传入。
代码如下:
public class SignatureVerificationInterceptor implements HandlerInterceptor {
private static PartnerInfoConfig partnerInfoConfig;
public SignatureVerificationInterceptor(PartnerInfoConfig partnerInfoConfigParam) {
partnerInfoConfig = partnerInfoConfigParam;
}
4、起初在网上搜索了不少根据不同环境读取不同配置的博文。有不少方案,但是如上方便可能是最容易简单的。
很多地方引用了如下这个博文。博文中的方法应是可以的,但是比较麻烦。当然,这个是因为自定义了yml文件名称。
文中有不对或者不妥的地方,欢迎诸君批评指正。
欢迎加微信交流: