要用到Spring的util(包括util:list等),xml文件中的beans中需要添加一些有关util的信息:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- bean definitions here --> </beans>

首先定义一个City类。

package com.moonlit.myspring;

public class City {
private String name;
private String state;
private int population;
@Override
public String toString() {
return String.format("[%s,%s,%d]", name, state, population);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public int getPopulation() {
return population;
}
public void setPopulation(int population) {
this.population = population;
}
}

使用<util:list>元素在Spring里配置一个包含City对象的List集合。

  <util:list id="cities">
<bean class="com.moonlit.myspring.City"
p:name="Beijing" p:state="BJ" p:population="215213241" />
<bean class="com.moonlit.myspring.City"
p:name="Shanghai" p:state="SH" p:population="242612378" />
<bean class="com.moonlit.myspring.City"
p:name="Guangzhou" p:state="GD" p:population="12700812" />
<bean class="com.moonlit.myspring.City"
p:name="Hangzhou" p:state="HZ" p:population="8700420" />
<bean class="com.moonlit.myspring.City"
p:name="Baoding" p:state="BD" p:population="11194443" />
<bean class="com.moonlit.myspring.City"
p:name="Harbin" p:state="HRB" p:population="10636003" />
<bean class="com.moonlit.myspring.City"
p:name="Shuzhou" p:state="SZ" p:population="10466092" />
<bean class="com.moonlit.myspring.City"
p:name="Xian" p:state="XA" p:population="8467821" />
</util:list>

<util:list>元素是由Spring的util命名空间所定义的。它创建了一个java.util.List类型的Bean,这个集合里包含了所有以上配置的Bean。
<util:list>对象也是一个Bean,我们可以通过以下方式获得cities:

List<City> cities = (List<City>) context.getBean("cities");

可以通过如下方式访问集合成员:

    <property name="chosenCity" value="#{cities[2]}" />
<property name="randomChosenCity" value="#{cities[T(java.lang.Math).random() * cities.size()]}" />

中括号([])运算符会始终通过索引访问集合中的成员。
[]运算符同样可以用来获取java.util.Map集合中的成员。例如,假设City对象以其名字作为键放入Map集合中。在这种场景下,我们可以像下面展示的那样获取键为Dallas的entry:

<property name="choseCity" value="#{cities['Dallas']}" />

[]运算符还可以从java.util.Properties集合中获取值。例如,假设我们需要通过<util:properties>元素在Spring中加载一个properties配置文件:

<util:properties id="settings" location="classpath:setting.properties" />

这里定义的settings Bean是一个java.util.Propertes类,夹在了一个名为名为settings.properties的文件。我们可以使用SpEL获得settings Bean中名为twitter.accessTokend的对象:

<properties name="accessToken" value="#{settings['twitter.accessToken']}" />

除了访问<util:properties>所生命的集合中的属性,Spring还为SpEL选择了两种特殊的选择属性的方式:systemEnvironment和systemProperties。
systemEnvironment包含了应用程序所在机器上的所有环境变量。

<property name="homePath" value="${systemEnvironment['HOME']}" />

systemPropreties包含了Java应用程序启动时所设置的所有属性(通常通过-D参数)。例如,如果使用-Dapplication.home=/etc/myapp,来启动JVM,那么你就可以通过以下SpEL表达式将该值注入homePath属性中:

<property name="homePath" value="#{systemProperties['application.home']}" />

[]运算符同样可以通过索引来得到字符串的某个字符。例如,下面的表达式返回“s”:

'This is a test'[3]

查询集合成员 —— 查询运算符(.?[])

<property name="bigCities" value="#{cities.?[population gt 2e7]}" />

查询运算符会创建一个新的集合,新的集合中只存放符合中括号内的表达式的成员。这里,bigCIties属性被注入了人口多于20000000的城市集合。
SpEL还提供了两种其他查询运算符:
“.^[]”:从集合中查询第一个匹配项。
“.$[]”:从集合中查询最后一个匹配项。
例如:

<property name="aBigCity" value="#{cities.^[population gt 2e7]}" />
<property name="aBigCity" value="#{cities.$[population gt 2e7]}" />

投影集合 —— 投影运算符(.![])
集合投影是从集合的每一个元素中选择特定的属性放入一个新的集合中。
例如,从cities中获得所有的name:

<property name="cityNames" value="#{cities.![name]}" />

查询运算符.?[]和投影运算符.![]可以混合使用。

<property name="sityNames" value="#{cities.?[population gt 2e7].![name + ',' + state]}" />

演示上面部分效果的程序:

package com.moonlit.myspring;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Hero {
private City chosenCity;
private City randomChosenCity;
private String homePath;
private List<City> bigCities;
private List<String> cityNames;
public void perform() {
System.out.println("chosen city = " + chosenCity);
System.out.println("random chosen city = " + randomChosenCity);
System.out.println("home path = " + homePath);
System.out.println("big cities:");
for (City city : bigCities)
System.out.println("\t" + city);
System.out.println("city names :");
for (String cityName : cityNames)
System.out.println("\t" + cityName);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-util-idol.xml");
// util:list is also a bean
List<City> cities = (List<City>) context.getBean("cities");
for (City city : cities)
System.out.println(city);
Hero hero = (Hero) context.getBean("hero");
hero.perform(); }
public City getChosenCity() {
return chosenCity;
}
public void setChosenCity(City chosenCity) {
this.chosenCity = chosenCity;
}
public City getRandomChosenCity() {
return randomChosenCity;
}
public void setRandomChosenCity(City randomChosenCity) {
this.randomChosenCity = randomChosenCity;
}
public String getHomePath() {
return homePath;
}
public void setHomePath(String homePath) {
this.homePath = homePath;
}
public List<City> getBigCities() {
return bigCities;
}
public void setBigCities(List<City> bigCities) {
this.bigCities = bigCities;
}
public List<String> getCityNames() {
return cityNames;
}
public void setCityNames(List<String> cityNames) {
this.cityNames = cityNames;
} }

Hero.java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- bean definitions here --> <util:list id="cities">
<bean class="com.moonlit.myspring.City"
p:name="Beijing" p:state="BJ" p:population="21521324" />
<bean class="com.moonlit.myspring.City"
p:name="Shanghai" p:state="SH" p:population="24261237" />
<bean class="com.moonlit.myspring.City"
p:name="Guangzhou" p:state="GD" p:population="12700812" />
<bean class="com.moonlit.myspring.City"
p:name="Hangzhou" p:state="HZ" p:population="8700420" />
<bean class="com.moonlit.myspring.City"
p:name="Baoding" p:state="BD" p:population="11194443" />
<bean class="com.moonlit.myspring.City"
p:name="Harbin" p:state="HRB" p:population="10636003" />
<bean class="com.moonlit.myspring.City"
p:name="Shuzhou" p:state="SZ" p:population="10466092" />
<bean class="com.moonlit.myspring.City"
p:name="Xian" p:state="XA" p:population="8467821" />
</util:list> <bean id="hero" class="com.moonlit.myspring.Hero">
<property name="chosenCity" value="#{cities[2]}" />
<property name="randomChosenCity" value="#{cities[T(java.lang.Math).random() * cities.size()]}" />
<property name="homePath" value="#{systemEnvironment['HOME']}" />
<property name="bigCities" value="#{cities.?[population gt 2e7]}" />
<property name="cityNames" value="#{cities.![name]}" />
</bean> </beans>

spring-util-idol.xml

扩展阅读(Spring4.0.x doc里面的xml配置信息和很多例子):http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/xsd-config.html

理解:
<util:list>,<util:map>,<util:properties>可以装配集合,使用前请声明util命名空间。
通过<util:properties id="XX" location="classpath:YY.properties">读取YY.properties文件。
查询运算符:
.?[]:查询所有匹配项
.^[]:查询第一个匹配项
.$[]:查询最后一个匹配项
投影运算符:
.![]

Spring学习笔记--在SpEL中筛选集合的更多相关文章

  1. Spring实战学习笔记之SpEL表达式

            在Spring XML配置文件中装配Bean的属性和构造参数都是静态的,而在运行期才知道装配的值,就可以使用SpEL实现         SpEL表达式的首要目标是通过计算获得某个值. ...

  2. Spring学习笔记(一)

    Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...

  3. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

  4. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  5. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  6. Spring学习笔记之依赖的注解(2)

    Spring学习笔记之依赖的注解(2) 1.0 注解,不能单独存在,是Java中的一种类型 1.1 写注解 1.2 注解反射 2.0 spring的注解 spring的 @Controller@Com ...

  7. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  8. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  9. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

随机推荐

  1. iOS NSURLConnection使用详解

    一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...

  2. webrtcchatde源代码下载

    这个是源代码地址: http://download.csdn.net/detail/duerbin3/5433617 这个demo是国内牛人赵书剑开发的视频聊天室,基于webrtc.io实现. 该项目 ...

  3. 【Visual Studio】解决方案未保存,请先保存你的解决方案,然后再管理Nuget包

    上网下的Demo,文件夹中没有.sln文件,用VS打开.csproj文件来打开方案.此时可能因为一些引用问题想打开Nuget包管理器,会弹出如下提示: 解决方案未保存,请先保存你的解决方案,然后再管理 ...

  4. FireFox火狐不能设置新标签页

    问题:已经在Tab Mix Plus中设置了新建标签页为自定义的网址,但依然没用. 百度很多都是让改about:config中的browser.newtab.url,然而这并没卵用. 办法:https ...

  5. C语言 · 实现strcmp函数 · 字符串比较

    蓝桥杯练习场上碰到两个此类题了: 算法提高 11-1实现strcmp函数   时间限制:1.0s   内存限制:256.0MB      问题描述 自己实现一个比较字符串大小的函数,也即实现strcm ...

  6. Java命令学习系列(二)——Jstack

    Java命令学习系列(二)——Jstack 2015-04-18 分类:Java 阅读(512) 评论(0) jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚 ...

  7. 缓存之 ACache

    1.android缓存的介绍 Android开发本质上就是手机和互联网中的webserver之间进行通信,就必定须要从服务端获取数据.而重复通过网络获取数据是比較耗时的.特别是訪问比較多的时候.会极大 ...

  8. else好像必须做点什么,可以省点资源不做什么吗,else下不能用pass

    portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': ...

  9. thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误

    一个困扰了N久的问题... 网上大多帖子是这么写的 onclick调javascript函数时,不能直接使用onclick=“editUser(${prod.id})”,这样会报错,需要修改成如下的格 ...

  10. 用javascript将数据导入Excel

    网上收集的代码 <input type="button" name="out_excel" onclick="AutomateExcel();& ...