属性占位符

属性占位符

直接从Environment中检索属性是非常方便的,尤其是在Java配置中装配bean的时候。但是,Spring也提供了通过占位符装配属性的方法,这些占位符的值会来源于一个属性源。

解析属性占位符

Spring一直支持将属性定义到外部的属性文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用"${...}"包装的属性名称。

为了使用占位符,我们必须要配置一个PropertyPlaceholderConfigurer bean或者 PropertySourcesPlacheholderConfiguer bean。

从Spring 3.1卡是,推荐使用PropertySourcesPlacholderConfigurer,因为它能够基于Spring Environment及其属性源来解析占位符。

@Bean
public static PropertySourcesPlacheholderConfigurer placeholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

我们可以通过使用@Value注解,来获取属性文件的属性。

public BlankDisc(@Value("${disc.title}") String title){
    this.title = title
}

解析外部属性能够将值的处理推迟到运行时,但是它的关注点在于根据名称解析来自于Spring Environment和属性源的属性。而Spring表达式语言提供了一种更通用的方式在运行时计算所要注入的值。

SpEL

Spring Expression Language,SpEL拥有很多特性,包括

  • 使用bean的ID来引用bean

  • 调用方法和访问对象的属性

  • 对值进行算术、关系和逻辑运算

  • 正则表达式匹配

  • 集合操作

SpEL表达式要放到"#{...}"之中。

SqEL样例

#{T{System}.currentTimeMillis()}
#{T(java.lang.Math).PI}

T()运算符,可以访问类作用域的方法或常量。

#{sgtPeppers.artist}
#{sgtPeppers}
#{sgtPeppers.getArtist()}
#{sgtPeppers.getArtist()?.toUpperCase()}

上面这个表达式会计算得到ID为sgtPeppers的bean的artist属性、得到bean或者调用bean上面的方法。.?运算符能够在访问它右边的内容之前,确保它所对应的元素不是null。如果getArtist()返回值是null的话,不会调用toUpperCase()。

#{systemProperties['disc.title']}

我们还可以通过systemProperties对象引用系统属性。

#{3.14159}
#{9.87E4}
#{'Hello'}
#{false}

表示字面值。

#{jukebox.songs[4].title}
#{'This is a test'[3]} //s

[]运算符用来从集合或数组中按照索引获取元素。

SpEL运算符

Last updated