Java代码
@Value("#{${}}")
private Map<String,String> map;
@Value("#{'${.list1}'.split(',')}")
private List nameList1;
@Value("#{${.list2}}")
private List nameList2;
注意:要注入配置文件值的类,必须是springBean,即使用@Component、@Service、@Controller等注解的类。普通java bean是不能注入值的,因为其没有交给Spring容器管理,默认情况下spring管理的bean都是单例。
其实例构造完成之后,这个时候@Value注解就会触发,中内部类(Object bean, String beanName, PropertyValues pvs)这个方法就会将bean的属性注入进去了。注入属性完成后,spring再去加载其他的bean。1
properties格式配置文件
test.application.properties.map = {key1:'value1',key2:'value2'}
# 实际上是注入Spring,然后用SPEL表达式根据分隔符进行切分
test.application.properties.list1 = aaa,bbb,ccc
test.application.properties.list2 = {'aaa','bbb','ccc'}
yml格式配置文件2
test:
application:
properties:
map: "{key1:'value1',key2:'value2'}"
list1: "aaa,bbb,ccc"
list2: "{'aaa','bbb','ccc'}"
list3:
- '111'
- '222'
- '333'
补充:用@ConfigurationProperties来实现更优雅的注入map,list等复杂数据结构
java代码
@Component
@ConfigurationProperties(prefix = "")
public class SpringValueTest {
private Map<String,String> map;
private List list;
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
注意一定要属性值一定都要有setter方法 3,其原理就是通过反射获取其属性的setter方法来实现注入值的。
yml格式
test:
application:
properties:
map:
key1: 'value11'
key2: 'value22'
list:
- '111'
- '222'
- '333'
这样实现是不是map数据的可读性是不是瞬间提高了呢✌
总结(脱离应用场景都是耍流氓????)
当然不是所有的都适合用@ConfigurationProperties,如果专门编写了一个javaBean来和配置文件进行映射,这时候使用@ConfigurationProperties是最合适不过了,比如说一些配置类。当某个业务逻辑中需要获取一下配置文件中的某项值时,此场景下@value更合适,比如在serviceImpl中的一个属性。
-
/article/5579126081/ ↩︎
-
/p/1aa662a5f170 ↩︎
-
/u012903926/article/details/83750230 ↩︎