Spring3.0 入门进阶(2):SPEL用法大全

原创 2013年12月05日 23:30:26

Spring 已经盛行多年,目前已经处于3.0阶段,关于Spring的概念介绍性的东西网上已经很多,本系列博客主要是把一些知识点通过代码的方式总结起来,以便查阅.

作为入门,本篇主要介绍SPEL的使用.

SPEL(Spring Expression Language)是Spring 3引入的一个新特性,通过使用SPEL可以在程序运行的过程中,动态的对BEAN的属性进行赋值,话不多说,请看代码以及注释

入口类


package com.eric.introduce.spel;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 主要用来演示SPEL的用法
 * 
 * @author Eric
 * 
 */
public class SpelCaller {
	private static final String CONFIG = "com/eric/introduce/spel/spel.xml";

	private static ApplicationContext context = new ClassPathXmlApplicationContext(
			CONFIG);

	public static void main(String[] args) {
		//下面的几个方法主要是和操作Bean相关
		getNormalValue();
		getOtherBeanProperties();
		callOtherBeanMethod();
		getOtherBeanPropertiesByCheckSafe();
		getPropertiesByStaticField();
		//下面的几个方法主要是和操作集合相关
		getPropertyFromList();
		getAddressFromListByRandom();
		getAddressFromMap();
		getPropertiesFromProperties();
		getCityListByCondiciton();
		getFilterResult1st();
		getFilterResultLast();
		getFilterResultFieldList();
	}

	/**
	 * 打印几个常数值
	 */
	public static void getNormalValue() {
		Student testClass = (Student) context.getBean("eric");
		System.out.println(testClass.getName());
		System.out.println(testClass.getAge());
		System.out.println(testClass.isGender());
	}

	/**
	 * 利用SPEL从别的Bean属性中获得属性值
	 */
	public static void getOtherBeanProperties() {
		Student testClass = (Student) context.getBean("eric");
		System.out.println(testClass.getAddress());
	}

	/**
	 * 利用SPEL从别的Bean的方法调用中获得属性值
	 */
	public static void callOtherBeanMethod() {
		Student testClass = (Student) context.getBean("eric");
		System.out.println(testClass.getEmail());
	}

	/**
	 * get properties value by "Check Safe"
	 */
	public static void getOtherBeanPropertiesByCheckSafe() {
		Student testClass = (Student) context.getBean("eric");
		System.out.println(testClass.getDescription());
	}

	/**
	 * get properties value by static field/Method 此外这个例子中还演示了SPEL还支持
	 * 算数运算(+,-,*,/....) 关系运算(<,>,==,<=,>=...) 逻辑运算(and,or,not) 条件运算(?:)
	 * 正则表达式(matches)
	 * */
	public static void getPropertiesByStaticField() {
		Student testClass = (Student) context.getBean("eric");
		System.out.println(testClass.getRandomId());
		System.out.println(testClass.getPi());
	}

	/**
	 * 利用SPEL随机从列表中选择一个地址
	 */
	public static void getPropertyFromList() {
		Student testClass = (Student) context.getBean("getAddressFromList");
		System.out.println(testClass.getCity());
	}

	/**
	 * 利用SPEL随机从列表中随机一个地址
	 */
	public static void getAddressFromListByRandom() {
		Student testClass = (Student) context
				.getBean("getAddressFromListByRandom");
		System.out.println(testClass.getCity());
	}

	/**
	 * 利用SPEL从Map中选择一个地址
	 */
	public static void getAddressFromMap() {
		Student testClass = (Student) context.getBean("getAddressFromMap");
		System.out.println(testClass.getCity());
	}

	/**
	 * 利用SPEL从properties选择地址
	 */
	public static void getPropertiesFromProperties() {
		Student testClass = (Student) context
				.getBean("getPropertiesFromProperties");
		System.out.println(testClass.getUsername());
		System.out.println(testClass.getPwd());
	}

	/**
	 * 利用SPEL从城市列表中选择地址人口大于123456的城市
	 */
	public static void getCityListByCondiciton() {
		Student testClass = (Student) context
				.getBean("getCityListByCondiciton");
		System.out.println(testClass.getFavCities());

	}

	/**
	 * 利用SPEL从城市列表中选择地址人口大于123456的结果中的第一个
	 */
	public static void getFilterResult1st() {
		Student testClass = (Student) context.getBean("getFilterResult1st");
		System.out.println(testClass.getBestCity());
	}

	/**
	 * 利用SPEL从城市列表中选择地址人口大于123456的结果中的最後一个
	 */
	public static void getFilterResultLast() {
		Student testClass = (Student) context.getBean("getFilterResultLast");
		System.out.println(testClass.getWorCity());
	}

	/**
	 * 利用SPEL从城市列表中选择地址人口大于123456的结果的所有名字
	 */
	public static void getFilterResultFieldList() {
		Student testClass = (Student) context
				.getBean("getFilterResultFieldList");
		System.out.println(testClass.getFavCitieNames());
	}

}

配置

<?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"
	xmlns:p="http://www.springframework.org/schema/p"
	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-3.2.xsd">

	<!-- 用来模拟SPEL对集合的操作 -->
	<util:list id="cities">
		<bean class="com.eric.introduce.spel.City" p:name="NJ" p:state="JS"
			p:population="123456" />

		<bean class="com.eric.introduce.spel.City" p:name="HZ" p:state="ZJ"
			p:population="1231232" />

		<bean class="com.eric.introduce.spel.City" p:name="SJ" p:state="JS"
			p:population="778865" />
	</util:list>
	<!-- 用来模拟SPEL对MAP的操作 -->
	<util:map id="citiesmap">
		<entry key="nanjing" value-ref="nanjing" />
		<entry key="hangzhou" value-ref="hangzhou" />
	</util:map>
	<!-- 用来模拟SPEL对Properties的操作 -->
	<util:properties id="authorization"
		location="classpath:com/eric/introduce/spel/account.properties" />

	<bean id="nanjing" class="com.eric.introduce.spel.City" p:name="NJ"
		p:state="JS" p:population="123456" />

	<bean id="hangzhou" class="com.eric.introduce.spel.City" p:name="HZ"
		p:state="ZJ" p:population="1231232" />

	<!-- 通过Index从list中选择地址 -->
	<bean id="getAddressFromList" class="com.eric.introduce.spel.Student">
		<property name="city" value="#{cities[2]}"></property>
	</bean>

	<!-- 随机从list中选择地址 -->
	<bean id="getAddressFromListByRandom" class="com.eric.introduce.spel.Student">
		<property name="city"
			value="#{cities[T(java.lang.Math).random()*cities.size()]}"></property>
	</bean>

	<!-- 从map选择地址 -->
	<bean id="getAddressFromMap" class="com.eric.introduce.spel.Student">
		<property name="city" value="#{citiesmap['hangzhou']}"></property>
	</bean>

	<!-- 从properties选择地址 -->
	<bean id="getPropertiesFromProperties" class="com.eric.introduce.spel.Student">
		<property name="username" value="#{authorization['username']}" />
		<property name="pwd" value="#{authorization['password']}" />
	</bean>

	<!-- 从城市列表中选择地址人口大于123456的城市 -->
	<bean id="getCityListByCondiciton" class="com.eric.introduce.spel.Student">
		<property name="favCities" value="#{cities.?[population gt 123456]}" />
	</bean>

	<!-- 从城市列表中选择地址人口大于123456的结果中的第一个 -->
	<bean id="getFilterResult1st" class="com.eric.introduce.spel.Student">
		<property name="bestCity" value="#{cities.^[population gt 123456]}" />
	</bean>

	<!-- 从城市列表中选择地址人口大于123456的结果中的最後一个 -->
	<bean id="getFilterResultLast" class="com.eric.introduce.spel.Student">
		<property name="worCity" value="#{cities.$[population gt 123456]}" />
	</bean>

	<!-- 从城市列表中选择地址人口大于123456的结果的所有名字 -->
	<bean id="getFilterResultFieldList" class="com.eric.introduce.spel.Student">
		<property name="favCitieNames"
			value="#{cities.?[population gt 123456].![name+'_'+state]}" />
	</bean>



	<bean id="eric" class="com.eric.introduce.spel.Student">


		<!-- 表达常量值 -->
		<property name="name" value="#{'Eric'}"></property>
		<property name="age" value="#{28}"></property>
		<property name="gender" value="#{true}"></property>

		<!-- reference other bean properties -->
		<property name="address" value="#{simon.address}"></property>

		<!-- get properties value from other bean method -->
		<property name="email" value="#{simon.getEmailByName().toUpperCase()}"></property>

		<!-- get properties value by "Check Safe" -->
		<property name="description" value="#{simon.getDescription()?.toUpperCase()}"></property>

		<!-- get properties value by static field/Method -->
		<property name="randomId" value="#{T(java.lang.Math).random()*1000}"></property>
		<property name="pi" value="#{T(java.lang.Math).PI}"></property>
	</bean>

	<bean id="simon" class="com.eric.introduce.spel.Student">
		<property name="name" value="#{'Simon'}"></property>
		<property name="address" value="#{'WUHAN'}"></property>
	</bean>
</beans>

其他主要相关类

package com.eric.introduce.spel;

import java.util.List;

public class Student {
	private int randomId;
	private float pi;
	private String name;
	private boolean gender;
	private Integer age;
	private String address;
	private String email;
	private String description;
	private City city;
	private String username;
	private String pwd;
	private List<City> favCities;
	private List<String> favCitieNames;
	private City bestCity;
	private City worCity;
        //......get/Set省略
}

package com.eric.introduce.spel;

public class City {
    private String name;
    private String state;
    private int population;

 //......get/Set省略
}







相关文章推荐

Spring3.0 入门进阶(1):从配置文件装载Bean

Spring 已经盛行多年,目前已经处于3.0阶段,关于Spring的概念介绍性的东西网上已经很多,本系列博客主要是把一些知识点通过代码的方式总结起来,以便查阅....

Spring3.0 入门进阶(4):注解式控制器简介

一、Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类。已经@Deprecated。 二、Spring2.5引入注解式处理器支持,通过@Controller...

Spring3.0 入门进阶(3):基于XML方式的AOP使用

AOP是一个比较通用的概念,主要关注的内容用一句话来说就是"如何使用一个对象代理另外一个对象",不同的框架会有不同的实现,Aspectj 是在编译期就绑定了代理对象与被代理对象的关系,而Spring是...

Spring3.0 入门进阶(6):自定义校验器

在Spring 3 中,对表单提交的校验方式比较常见的有两种 (1)基于注解:对于简单的属性校验,例如,长度,非空等,可以使用Spring,或是Hibernate自带的校验注解 (2)自定义校...

Spring 3.0参考之SpEL

Spring 3.0 RC1发布,一些新特性很吸引人,看了一下Reference,顺便翻译了SpEL这节,水平有限,还望指教。 Spring 3.0 Reference:http://static....

Spring3.0 —— 表达式语言(SpEL)

Spring 3.0 中新增加了 Spring 表达式语言,可以在Spring 的任意需要配置的地方使用该功能。           Spring 的表达式语言与Java注解结合,以便开发人员可以撰...

Spring 3.0参考手册之SpEL

Spring 3.0 RC1发布,一些新特性很吸引人,看了一下Reference,顺便翻译了SpEL这节,水平有限,还望指教。 Spring 3.0 Reference:http://static....

从头认识Spring-1.14 SpEl表达式(2)-嵌入Bean、Bean的属性和Bean的方法

这一章节我们来讨论一下使用SpEl表达式嵌入Bean、属性和方法。1.domain烤炉类:(不变)package com.raylee.my_new_spring.my_new_spring.ch01...

从头认识Spring-1.15 对SpEl的值的操作(2)-对比值

这一章节我们来讨论一下对SpEl的值的对比值。1.domain烤炉类:(增加了bigOrNot属性)package com.raylee.my_new_spring.my_new_spring.ch0...

从头认识Spring-1.16 SpEl对集合的操作(2)-查询集合以及投影元素集合

这一章节我们来讨论一下查询集合以及投影元素集合。我们下面用一个例子说明上面的这两个部分。1.domain蛋糕类:(不变)package com.raylee.my_new_spring.my_new_...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring3.0 入门进阶(2):SPEL用法大全
举报原因:
原因补充:

(最多只允许输入30个字)