Spring学习笔记--在SpEL中筛选集合

要用到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文件。
查询运算符:
.?[]:查询所有匹配项
.^[]:查询第一个匹配项
.$[]:查询最后一个匹配项
投影运算符:
.![]

时间: 2024-10-12 09:24:17

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

【知了堂学习笔记】java中常用集合的理解

最近学习了java中常用集合类的一些知识,在这里作为一只小白,我来谈谈我的理解,顺带总结知识点. 引入:在没有接触之前,听到集合,给我感觉是想到了数学中的集合一样,里面存放着一个一个的元素.其实不然,这个集合也就差不多,是用来存放元素的容器. Java中的集合类包含的内容很多而且很重要,很多数据的存储和处理(排序,去重,筛选等)都需要通过集合类来完成. 今天我要谈的主要是,如下图所示: 1.Collection Collection是最基本的集合类型,若要检查Collection中的元素,可以使

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等.实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些.既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例. 续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复.下面着重加入AOP实现DAO层动态分库调用.可先看上篇文章<spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例 >

Spring学习笔记(三)

Spring学习笔记(三) AOP 一.使用Annotation方式实现AOP.步骤: xml里加入配置:<aop:aspectj-autoproxy /> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

Spring学习笔记--initmethod和构造函数、setter方法的加载顺序

今天学习了一下spring中bean的初始化和销毁,突然想了解一下初始化方法跟构造函数及setter方法注入的执行顺序,记录在此,仅作为学习笔记. 当实例化一个bean时,可能需要执行一些初始化操作来确保该bean处于可用状态.同样地,当不再需要bean时,将其从容器中移除是,我们可以还需要按顺序 执行一些清除工作. package com.zp.chapter2; public class Auditorium { private String name; public void doBefo

[学习笔记]面向对象开发中的一些思想和原则

摘自<Java与模式>作者阎宏 面向对象的可复用设计的第一块基石:开闭原则(一个软件实体应当对扩展开放,对修改关闭) "开-闭"原则的手段和工具: 1)里氏代换原则:任何基类出现的地方,子类一定可以出现: 2)依赖倒转原则:要依赖于抽象,不要依赖于实现: 3)合成\聚合复用原则:要尽量使用合成\聚合,而不是继承关系达到复用的目的: 4)迪米特法则:一个软件实体应该与尽可能少的其它实体发生相互作用: 5)接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口

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

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