SpringBoot配置文件外置,以及读取顺序
请参考:https://blog.csdn.net/mrluzle/article/details/79164342
-----------------------------------------------------------------------------------
今天j记录在把spring文件外置的时候,碰到两个比较坑的问题:
第一个坑:
在application.yml文件中有如下配置:
在代码中读取有两种方式
方式一:
在该类的方法中就可以直接使用driverclass1了,driverclass1的值就是application.yml文件中配置的值。
注意:如果driverclass1声明成static类型,将获取不到配置文件中的值,最后值为null
例如下面这样就不行的,最后就拿不到值:
@Value("${jdbc.master.driverclass}")
private static String driverclass1;
方式二:
按照上述方式获取,是没有问题的,但是同样,env变量不能声明成static类型
为了解决这个问题,最后加了一个PropertyUtils类来解决这个问题;
package com.everestfortune.riskmanagement.util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PropertyUtil {
private static final Logger log = LoggerFactory.getLogger(PropertyUtil.class);
private static Properties properties;
public static String getProperty(String key){
if (properties==null) {//双重锁模式
synchronized(PropertyUtil.class){
if(properties==null){
properties = new Properties();
}
}
try {
InputStream stream = PropertyUtil.class.getClassLoader().getResourceAsStream("application.yml");
properties.load(stream);
stream.close();
} catch (FileNotFoundException e) {
log.error(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
return properties.getProperty(key);
}
}
最后,在静态方法中使用PropertyUtils对象去获取配置变量的值:
PropertyUtil.getProperty("key");
第二个坑:
在配置文件中用了开关,如下:
spring:
profiles:
active: dev #默认环境(开发环境)
#active: test #默认环境(测试环境)
#active: prod #默认环境(生产环境)
可以切换active的值,来改变配置。
但是,但是,但是,,,,
使用上面的PropertyUtil去获取配置文件中配置的值时,发现永远取的都是prod(生产环境)的配置变量,
因为Property是不能识别springBoot的开关的,加载配置文件时候,后面的会覆盖前面的,
因为prod(生产环境)的配置,是写在配置文件的最后的,
所以使用PropertyUtil去取,取到的永远都是生产环境的!
结束!