Spring之@Value详解,利用SPEL注入List

Posted OkidoGreen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring之@Value详解,利用SPEL注入List相关的知识,希望对你有一定的参考价值。

先上答案,注入逗号分隔的字符串

@Value("#'$server.name'.split(',')")

$…用法 
里面的内容必须符合SpEL表达式,详细的语法,以后可以专门开新的文章介绍, 通过@Value(“$spelDefault.value”)可以获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。可以通过赋予默认值解决这个问题,如@Value("$spelDefault.value:127.0.0.1")

详细代码如下:

// 如果属性文件没有spelDefault.value,则会报错
    //  @Value("$spelDefault.value")
    //  private String spelDefault2;

    // 使用default.value设置值,如果不存在则使用默认值
    @Value("$spelDefault.value:127.0.0.1")
    private String spelDefault;

#…用法 

这里只演示简单用法:

 // SpEL:调用字符串Hello World的concat方法
    @Value("#'Hello World'.concat('!')")
    private String helloWorld;

    // SpEL: 调用字符串的getBytes方法,然后调用length属性
    @Value("#'Hello World'.bytes.length")
    private String helloWorldbytes;

$…和#…混合使用 
$...和#...可以混合使用,如下文代码执行顺序:通过$server.name从属性文件中获取值并进行替换,然后就变成了 执行SpEL表达式‘server1,server2,server3’.split(‘,’)。

// SpEL: 传入一个字符串,根据","切分后插入列表中, #和$配置使用(注意单引号,注意不能反过来$在外面,#在里面)
    @Value("#'$server.name'.split(',')")
    private List<String> servers;

在上文中在#外面,$在里面可以执行成功,那么反过来是否可以呢$在外面,#在里面,如代码

// SpEL: 注意不能反过来$在外面,#在里面,这个会执行失败
    @Value("$#'HelloWorld'.concat('_')")
    private List<String> servers2;

答案是不能。因为spring执行$是时机要早于#。在本例中,Spring会尝试从属性中查找#‘HelloWorld’.concat(‘_’),那么肯定找到,由上文已知如果找不到,然后报错。所以$在外面,#在里面是非法操作

小结

  • #… 用于执行SpEl表达式,并将内容赋值给属性
  • $… 主要用于加载外部属性文件中的值
  • #… 和$… 可以混合使用,但是必须#外面,$在里面

以上是关于Spring之@Value详解,利用SPEL注入List的主要内容,如果未能解决你的问题,请参考以下文章

Spring详解

spring为类的静态属性实现注入

一文详解SpEL表达式注入漏洞

day38 13-Spring的Bean的属性的注入:SpEL注入

spring04 spel注入

带有@Value 的 Spring 表达式语言 (SpEL):美元与哈希($ 与 #)