为什么要将信息放入配置文件中?
Java 项目中难免有一些配置信息(例如服务器名称,地址和端口号等等),为了实现一套代码多处部署使用,需要将这些配置信息提取到配置文件,在程序运行的时候获取,省去了为不同系统维护不同代码的麻烦。
在 Spring Boot 项目中实现配置文件信息的获取
在 Spring Boot 项目中读取配置文件的信息主要有以下两个方式:
@Value
注解:适合读取单条的配置信息。@ConfigurationProperties
注解:适合读取一组配置信息。
准备配置文件
假定我们需要在程序中使用如下的配置信息:
application.yml:
#Read by @Value
my:
name: Paul
#Read by @ConfigurationProperties
test:
string: Hello World
intValue: 10
booleanValue: false
list[0]: Hi
list[1]: Kate
list[2]: Mary
map.city: Sydney
map.street: George Street
nested.string: nested string
nested.intValue: 100
其中前缀为 my 的信息通过@Value
读取,前缀为 test 的信息通过@ConfigurationProperties
读取。
使用 @value 读取配置信息
@Value("${my.name:default}")
private String myName; //值为Paul
@Value 注解的书写规则为:@Value("${属性名:默认值}")
。如果属性名在配置文件中不存在,则将默认值注入到变量中。
使用 @ConfigurationProperties 读取配置文件
依照例子中的自定义信息格式,编写其对应的 Data Class 如下:
@ConfigurationProperties(prefix = "test")
@Component
public class MyConfigBean {
private String string;
private int intValue;
private boolean booleanValue;
private List<String> list;
private Map<String, String> map;
private final Nested nested = new Nested();
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(boolean booleanValue) {
this.booleanValue = booleanValue;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Nested getNested() {
return nested;
}
static class Nested {
private String string;
private int intValue;
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
}
}
需要使用这些配置的时候只需 Autowire 这个 class 即可:
@Autowire
private MyConfigBean myConfigBean;
public void test() {
String string = myConfigBean.getString(); // Hello World
int intValue = myConfigBean.getIntValue(); // 10
// ...
String nestedString = myConfigBean.getNested().getString(); // nested string
}
后续
对于更为复杂的属性文件解析,请阅读 SpringBoot 复杂配置信息读取
SpringBoot加载自定义配置文件_红藕香残玉簟秋的博客-CSDN博客
SpringBoot自定义配置文件(xxx.properties)_qq_31351071的博客-CSDN博客_springboot 自定义配置
spring boot项目-静态属性从配置文件取值
1.问题描述: 某常量类,部分属性声明不能使用明文或硬编码,即在这个java文件里不能出现明文,作为加密函数的参数也不行,也不能声明在其他java文件(这样对于代码安全扫描等于没处理)。于是,这种情况下就需要写在配置文件里。
2.分析与查找: 特别注意这是给静态属性赋值,试了下使用常规的@Value的方式没成功,感觉就算有成功途径也会很麻烦,所以决定换个方式。
在论坛看了几篇帖子,试了一个文件缓存流读取配置文件,然后用静态代码块完成赋值的方式,觉得比较好(传送门:https://blog.csdn.net/xibei19921101/article/details/107342434)。
这里简要记录一下。
3.解决方法: 上代码片段:
static {
Properties pt = new Properties();
try{
InputStream ist = new BufferedInputStream(new FileInputStream(new File(".\\src\\main\\resources\\application.yml")));
pt.load(new InputStreamReader(ist,"utf-8"));
//从配置文件取值并且加密
某静态属性=加密工具类名.encrypt(pt.getProperty("配置项的key"),加密秘钥字符串);
}catch (Exception e){
throw new BusinessException(异常码code,"读取配置文件失败");
}
}
这个类的静态属性赋值在一个静态代码块中完成,仅在这个类加载时执行一次。
PS:使用BufferedInputStream起到缓存的作用。里面new FileInputStream(new File(“相对路径”))的方式与new FileInputStream(“相对路径”)的方式差不多,实际上后者在执行时还是用的前者的方式,具体可以去扒源码。