在上面的代码中,我们在没有任何运算规则的情况下装配Bean的。为了更加灵活,Spring 还提供了表达式语言Spring EL。通过Spring EL可以拥有更加强大的运算规则更好的装配Bean。
最常用的当然是读取配置文件的值。例如:
@Value("${datsource.driverName}")
private String dirverName;
这里的@Value中的${…}代表占位符,他会读取上下文属性值装配到属性中,这便是一个最简单的Spring表达式。除此之外,他还能够调用方法,例如,我们记录一个Bean的初始化时间:
@Value("#{T(System).currentTimeMillis()}")
private Long initTime=null;
注意这里的#{…}代表启用Spring表达式,他将具有运算功能;T(…)代表的是引入类;System是java.lang.*包的类,这是Java默认加载的包,因此可以不必写全限定名,如果是其他包,则需要写出全限定名才能引入类;currentTimeMillis是他的静态(static)方法,也就是我们调用一次System.curentTimeMillis()方法来为这个属性赋值。
此外还可以给属性直接进行赋值,代码如下
/**使用SpringEL赋值
//赋值字符串
@Value("#{'使用Spring EL赋值字符串'}")
private String str = null;
//科学计数法赋值
@Value("#{9.3E3}")
private String str = null;
//赋值浮点数
@Value("#{3.14}")
private String str = null;
显然这是比较灵活的,有时候我们还可以获取其他Spring Bean的属性来给当前的Bean属性赋值,例如
@Value("#{beanName.str}")
private String otherBeanProp=null;
注意这里的beanName是Spring IoC容器Bean的名称。str是其属性,代表引用对应的Bean的属性给当前属性赋值。有时我们还希望这个属性的字母全部变成大写
@Value("#{beanName.str?.toUpperCase()}")
private String otherBeanProp=null;
再次注意这里的SpringEL,这里引用str属性后跟着一个?(问号).这个符号的含义是判断这个属性是否为空。如果不为空才会去执行toUpperCase()的方法。除此之外,还可以使用Spring EL进行一定的运算。
//数学运算
@Value("#{1+2}")
//浮点数比较运算
@Value("#{beanName.pi==3.14f}")
//字符串比较运算
@Value("#{beanName.str eq 'aaa'}")
//字符串链接运算
@Value("#{beanName.str + 'aaa'}")
//三元运算
@Value("#{beanName.d > 1000 ? '大于':'小于'}")
其实使用率不高,只要会基本的${}和#{}就差不多了