springboot读取属性文件

一使用@Value注解

最常用的 key-value 形式的配置就是通过 @Value 注解  :

value2 = 3333
key = value1
key2 = ${value2:default_value2}
key3 = \u4F60\u597D

然后代码中使用了:

	@Value("${key}")
	private String key1;

	@Value("${key2}")
	private String key2;

	@Value("${key3:default_value3}")
	private String key3;

	@Value("${key4:deflault_value4}")
	private String key4;
  1. 对于配置文件里面的key1表示,对应的值是value1, 如果使用@Value("${key1}") 的时候没有找到对应的值程序就会抛出异常退出。
  2. 对于配置文件里面的key2表示,对应的值是default_value2, 但是可以支持通过手动设置java启动参数-Dvalue2来设置value2来改变默认值。
  3. 对于 @Value("${key3:default_value3}") 表示试图去找配置文件中的 key3, 如果找到了就用配置文件中的值,没有找到的话,不会抛出异常,而是用 default_value3 替代。

把配置文件转成对象:

@Configuration
@EnableConfigurationProperties({
    CollectionConfig.class, QiNiuConfig.class
})

其中注解 @Configuration 表示这个类为配置类,需要读配置文件,@EnableConfigurationProperties 表示需要可以把配置文件映射成类的对象,是符合java的面向对象的思想的。


props: #自定义的属性和值
  simpleProp: simplePropValue
  arrayProps: 1,2,3,4,5
  listProp1:
    - name: abc
      value: abcValue
    - name: efg
      value: efgValue
  listProp2:
    - config2Value1
    - config2Vavlue2
  mapProps:
    key1: value1
    key2: value2

创建一个bean来接收配置信息:


@Component
@ConfigurationProperties(prefix="props") 
public class MyProps {
	private String simpleProp;
	private String[] arrayProps;
	private List<Map<String, String>> listProp1 = new ArrayList<>(); //接收prop1里面的属性值
	private List<String> listProp2 = new ArrayList<>(); //接收prop2里面的属性值
	private Map<String, String> mapProps = new HashMap<>(); //接收prop1里面的属性值
	
	public String getSimpleProp() {
		return simpleProp;
	}
	
	//String类型的一定需要setter来接收属性值;maps, collections, 和 arrays 不需要
	public void setSimpleProp(String simpleProp) {
		this.simpleProp = simpleProp;
	}
	
	public List<Map<String, String>> getListProp1() {
		return listProp1;
	}
	public List<String> getListProp2() {
		return listProp2;
	}
 
	public String[] getArrayProps() {
		return arrayProps;
	}
 
	public void setArrayProps(String[] arrayProps) {
		this.arrayProps = arrayProps;
	}
 
	public Map<String, String> getMapProps() {
		return mapProps;
	}
 
	public void setMapProps(Map<String, String> mapProps) {
		this.mapProps = mapProps;
	}
}

启动后,这个bean里面的属性就会自动接收配置的值了。

(3) 其他
如果一定要利用@Value来接受list参数,可以通过利用 @Value注解的表达式函数进行解析

@Value("#{'${list}'.split(',')}")
private List<String> list;

@Value("#{${map}}")  
private Map<String,String> map;

然后配置文件中写成

list: topic1,topic2,topic3
map: "{key1: 'value1', key2: 'value2'}"

ps: 注意上面的map解析中,一定要用""把map所对应的value包起来,要不然解析会失败,导致不能转成 Map<String,String> map; 对象。

YML读取注意事项

使用YML时遇到的坑: 
最近在做项目时,遇到了一些在读取YML配置时发生的问题,在这里写一并写下来,希望给自己以及大家一个提示,能尽量避免在读取配置文件时发生这些错误,给开发带来不必要的多余时间去处理。

多重层级读取

在YML中我们再添加一个ZZP2的配置信息,其中包含了girl节点以及girl下的name,age属性

zzp2:
  name: 西科啦啦
  age: 30
  height: 175cm
  weight: 760kg
  long: 10cm
  girl:
    name: Marry.Jean
    age: 18

和之前一样,我们controller中通过@Value注解来获取属性值,同时创建一个url来输出我们的属性值。

@Value("${zzp2.name}")
private String name2;

@Value("${zzp2.girl.age}")
private Integer girlAge;

@Value("${zzp2.girl.name}")
private String girlName;

@RequestMapping(value = "/getZzpGirlInfo",method = RequestMethod.GET)
public String getZzpGirlInfo(){
    return "zzp2.name:" + name2 + "\n" + "zzp2.girl.age:" + girlAge + "\n" + "zzp2.girl.name:" + girlName;
}

 接下来我们通过POSTMAN来访问下,可以看到使用注解@Value没有问题,都可以渠道属性值。

接下来我们按照之前的思路建立一个Zzp2properties来将配置文件转变为一个实体类进行接收,这个时候问题就来了,我们如何定义girl这个属性呢,我们之前说过,配置文件与实体类的映射是根据属性名一致来相互对应的,可是我们无法命名一个属性为girl.name啊。我想聪明的你应该已经想到了,是的,我们再建立一个实体类Girl来接收girl的参数,其中的属性也是与girl下的参数一一对应。

public class Girl {

    private String name;

    private String age;

  //get set 方法...
}
@Component
@ConfigurationProperties(value = "zzp2")
public class Zzp2Properties {

    private String name;

    private String height;

    private String weight;

    private Integer age;

    private Girl girl;

    @Override
    public String toString() {
        return "Zzp2Properties{" +
                "name='" + name + '\'' +
                ", height='" + height + '\'' +
                ", weight='" + weight + '\'' +
                ", age=" + age +
                ", girl=" + girl +
                '}';
    }
    //get set方法...

可以发现,girl的参数已经被注入进来,可以正常获得了,这里要特别说明的是在ZzpProperties中的属性Girl命名一定是girl,必须要与配置文件中的保持一致。 

static静态属性

在一般开发中,我们经常会做静态属性或是静态块的方法来给我们的config使用,比如我使用jedis时,config中就是使用静态块来创建链接,那在YML中能否将配置信息读进static中呢?很可惜,答案是否定的。 
我们首先在application.yml中增加zzp3的配置信息。

然后在controller中通过设置静态属性来获取配置信息。

@Value("${zzp3.name}")
private static String name3;

@Value("${zzp3.age}")
private static Integer age3;

@Value("${zzp3.height}")
private static String height3;

@RequestMapping(value = "/getZzp3Info",method = RequestMethod.GET)
public String getZzp3Info(){
   return "zzp3.name:" + name3 + "\n" + "zzp3.age:" + age3 + "\n" + "zzp3.name:" + name3;
}

通过POSTMAN的测试,我们发想,属性值都是null,无法得到配置文件参数。

那是不是我们就无法使用static来获取配置信息来呢?其实并不然,我们可以使用static属性的set方法来获取,我们添加三个参数的set方法,并吧set方法中的static给去掉,同时吧直接@Value置于set方法上。

private static String name3;

private static Integer age3;

private static String height3;

@Value("${zzp3.name}")
public void setName3(String name3) {
   Round2Controller.name3 = name3;
}

@Value("${zzp3.age}")
public void setAge3(Integer age3) {
   Round2Controller.age3 = age3;
}

@Value("${zzp3.height}")
public void setHeight3(String height3) {
   Round2Controller.height3 = height3;
}

猜你喜欢

转载自blog.csdn.net/qq_15140841/article/details/82048349