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

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省略
}







你可能感兴趣的:(spring,3,SPEL)