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

Java代码

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

    @Value("#{'${test.application.properties.list1}'.split(',')}")
    private List nameList1;

    @Value("#{${test.application.properties.list2}}")
    private List nameList2;

注意:要注入配置文件值的类,必须是springBean,即使用@Component、@Service、@Controller等注解的类。普通java bean是不能注入值的,因为其没有交给Spring容器管理,默认情况下spring管理的bean都是单例。
其实例构造完成之后,这个时候@Value注解就会触发,org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor中内部类AutowiredFieldElement.inject(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 = "test.application.properties")
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. https://www.pianshen.com/article/5579126081/ ↩︎

  2. https://www.jianshu.com/p/1aa662a5f170 ↩︎

  3. https://blog.csdn.net/u012903926/article/details/83750230 ↩︎

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值