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