为什么要将信息放入配置文件中?

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(“相对路径”)的方式差不多,实际上后者在执行时还是用的前者的方式,具体可以去扒源码。