目录
前言
在java项目中,我们可以通过以下几种常用方式获取并绑定配置文件中的信息:
- @Value注解
- Spring的Environment类(可通过接口或直接注入方式获取,然后使用getProperty()方法)
- @ConfigurationProperties注解(SpringBoot下使用)
@ConfigurationProperties是 Springboot 提供读取配置文件的一个注解,主要用于将配置文件中每个属性的值映射到当前类,被标识的类一定要放到容器的组件中,所以还需要使用 @Component 注解或 @Configuration 注解
@Value是 Spring 下获取配置文件的一个注解,如果该注解读取时未能找到对应的配置项且未设置默认值,则会报错
本文简单记录这两种注解的使用方式
配置读取
@ConfigurationProperties 配置文件如下:
# @ConfigurationProperties注解配置
# String 配置读取
config.test.strV=stringTest
# int 配置读取
config.test.intV=4
# boolean 配置读取
config.test.bolV=true
# list 两种配置读取方式
config.test.list=zhangSan, liSi
#config.test.list[0]=zhangSan
#config.test.list[1]=liSi
# map(bean同理) 两种配置读取方式
config.test.map.k1=v1
config.test.map.k2=v2
config.test.map.k3=v3
#config.test.map[k1]=v1
#config.test.map[k2]=v2
#config.test.map[k3]=v3
@Value 配置文件如下:
# @Value注解配置
# String 配置读取
config.value.strV=stringTest
# int 配置读取
config.value.intV=4
# boolean 配置读取
config.value.bolV=true
# list 配置读取,主要是通过分隔符进行分割
config.value.list=zhangSan,liSi
# map 配置读取
config.test.map={k1:'v1', k2:'v2', k3:'v3'}
配置文件实体类:
@Configuration
@ConfigurationProperties(prefix = "config.test")
public class ConfigTest {
private String strV;
private Integer intV;
private boolean bolV;
private List<String> list;
private Map<String, String> map;
@Override
public String toString() {
return "ConfigTest{" +
"strV='" + strV + '\'' +
", intV=" + intV +
", bolV=" + bolV +
", list=" + list +
", map=" + map +
'}';
}
}
测试类:
@SpringBootTest
@RunWith(SpringRunner.class)
public class ConfigTestTest {
@Autowired private ConfigTest configTest;
@Value("${config.value.strV:defalutStringValue}") private String strV;
@Value("${config.value.intV:8}") private Integer intV;
@Value("${config.value.bolV:false}") private boolean bolV;
@Value("#{'${config.value.list:null}'.split(',')}") private List<String> list;
@Value("#{${config.test.map}}") private Map<String, String> map;
@Test
public void test() {
// @ConfigurationProperties 注解测试
System.out.println(configTest.toString());
System.out.println("------------");
// @Value 注解测试
System.out.println("strV=" + strV);
System.out.println("intV=" + intV);
System.out.println("bolV=" + bolV);
System.out.println("list=" + list);
System.out.println("map=" + map);
}
}
输出如下:
ConfigTest{strV='stringTest', intV=4, bolV=true, list=[zhangSan, liSi], map={k1=v1, k2=v2, k3=v3}}
------------
strV=stringTest
intV=4
bolV=true
list=[zhangSan, liSi]
map={k1=v1, k2=v2, k3=v3}
@Value注解中"#{}"和"${}"区别
@Value("#{}"):SpEL表达式,通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
@Value("${}"):可以获取对应属性文件中定义的属性值