续上篇。
SpEL操作集合的能力是很让人着迷的。
为了刚好的展示,我们定义一个Person类。
package org.chen;
public class Person{
private int age;
private String name;
private double salary;
// omit the getter and setter
}
我们再配置一个包含Person对象的List集合。
<util:list id="persons">
<bean class="org.chen.Person"
p:name="CZP" p:age="21" p:salary="20000.0" />
<bean class="org.chen.Person"
p:name="JACK" p:age="18" p:salary="15000.0" />
</util:list>
下面看看SpEL操作集合:
使用[]访问:
<property name="chosenPerson" value="#{persons[1]}" />
对获取Map对象也类似。
它还可以访问<util:properties>所声明的属性。Spring 还为SpEL创造了两种特殊的选择属性的方式,一种是systemEnvironment,另一种是systemProperties.
前者是机器的环境变量。后者是Java 程序的所有设置属性,一般是-D参数。
<property name="homepath" value="#{systemEnvironment['HOME']}" />
对于自定义的properties文件,先通过<util:properties>加载。
<util:property id=”setting" location="classpath:setting.properties" />
上面展示的选择集合成员,下面是带查询条件的选择。
比如,我们查询工资(salary)高于16000的人。在SpEL只要一个查询运算符(.?[])就可以了.
<property name="highs" value="#{persons.?[salary gt 16000]}“ />
查询运算符会返回一个新的集合。
它还提供了返回查询满足条件的第一个或最后一个的运算符。.^[] , .$[] 这里不再举例。
可能你觉得它和SQL语句的功能有点类似,确实是。它还提供了投影功能(project)。
投影集合运算符 .![]
如返回所有人名字的集合,
<property name="names" values="#{persons.![name]}" />
但投影不局限于单一属性,我们对上面的修改得到名字和年龄的集合,
<property name="names" values="#{persons.![name + ‘,’+ age]}" />
你可能已经想到,我们可以把查询和投影可以一起使用。
<property name="names" values="#{persons.?[salary gt 16000].![name]}" />
正如上面介绍的,SpEL功能可以很强大,但我们一般不建议过度使用它。因为它毕竟是个字符串,难以在IDE下调式。