使用Spring表达式语言
问题
当你希望动态地评估一些条件或属性, 并将其作为IOC容器中的配置值使用;你也可能因为自定义范围的情况,必须将某些值从设计时延迟到运行时;或者只是需要为自己的应用添加强大的表达式语言。
解决方案
使用Spring 3.0的Spring表达式语言(SpEL),这用语言提供了与JSF和JSP中Unified EL或者对象图形导航语言(Object Graph Navigation language, OGNL)相似的功能。SpEL提供了易用的基础框架,可以在Spring容器之外的应用,在容器之中,它可以用于在许多情况下大大简化配置。
如果你使用过Struts2 或者Tapestry4,那么无疑使用过OGNL。有写表达式语言非常强大,SpEL也一样,从注解到XML配置,只要你能想象到需要它的地方,几乎都可以使用它。SpringSource工具套件也可以为这种表达式语言提供了自动完成和查找等强壮的支持。
类型 | 用法 | 实例 |
---|---|---|
文字表达式 | 最简单,实质和编写java代码相同,值String文字和各种数字 | 2342’Hello Spring Enterprise Recipes’ |
布尔和关系操作符 | 表达式语言提供java风格计算条件的能力 | T(java.lang.Math).random()>.5 |
标准表达式 | 可以枚举并返回Bean上的属性,与Unified EL方式相同,每个废弃的属性用句号分隔,使用JavaBean风格的命名习惯。在右边的实例与getCat().getMate().getName()等价 | cat.mate.name |
类表达式 | T()通知表达式语言对类而不是对实例起作用。在右边的例子中,第一个为java.lang.Math生成的一个Class实例–与调用java.lang.Math.class等价,第二个抵用给定类型上的静态方法,等价于调用java.lang.Math.random() | T(java.lang.Math) T(java.lang.Math).random() |
访问数组、list和map | 可以使用括号和关键字索引list、数组和map,对于数组和list关键字是索引号,对于map来说是一个对象。例子中java.util.List有4个字符,索引为1的返回”b”。第二个例子索引为”OR”访问map,产生于这个关键字关联的值 | T(java.lang.Arrays).asList(‘a’,’b’,’c’)[1] T(SpelExempleDemo).MapOfStatusAndCapitals[‘OR’] |
方法调用 | 方法可以在实例中调用,想java代码一样,这是基本JSF或者JSP表达式的显著改进 | “Hello, world”.toLowweCase() |
关系操作符 | 可以比较数字,返回值为布尔值 | 23==person.age ‘fala’<’fido’ |
调用构造程序 | 可以创建对象并调用构造程序 | new String(“Hello again!”) new Cat(‘Felix’) |
三元操作符 | 三元表达式如你预期 | T(java.lang.Math).random()>.5?’She loves me’:’She loves me’ |
变量 | SpEL让你设置和求变量值。变量可以有表达式接卸气上下文安装,还有一些隐含变脸如#this始终访问上下文的根对象 | this.firsName #customer.email |
集合投影 | SpEL有个非常强大的功能,就是执行map和集合的高级操作,这里腻味cats list创建一个投影,返回值是例句集合中每只猫的名称属性的集合。这样返回的书String对象的集合 | cats.![name] |
集合操作 | 选择让你在集合中的每个项目基础上计算是一个断言,仅保留那些断言为真的元素,从而动态地从集合或者map中过滤对象。例子中计算Map中每个Entity中java.util.Map.Entity.value属性,如果以‘s’开始小的小写字符串,那就保留,其他丢弃 | mapOfStatusAndCapital.? .[value.toLowerCase().startsWith(’s’)] |
模块化表达式 | 可以使用表达式计算表达式 | Your fortune is ${T(java.lang.Math).random()>.5?’good’:’bad’} |
@Value("#{systemProperties}")
private Properties systemProperties;
@Value("#{systemProperties['user.region']}")
private String userRegion;
//上下文配置了另一个Bean emailUtilities
@Value("#{emailUtilities.emial}")
private String email;
@Value("#{emailUtilitis}")
private EmailUtilitises emailUtilitises;
你也可以在XML配置用注解支持相同的方式使用表达式语言,如
<bean class="com.xxx.xxx.spel.emailNitifyEngine">
p:randomNumber="#{T(java.lang.Math).random()*100.0}"
</bean>
使用Spring表达式语言解析器参考 > http://blog.csdn.net/u011225629/article/details/47143083