Spring的@Value注入map&List, properties、yml格式配置文件的多种实现方式

时间:2025-02-13 21:05:40

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中的一个属性。


  1. /article/5579126081/ ↩︎

  2. /p/1aa662a5f170 ↩︎

  3. /u012903926/article/details/83750230 ↩︎