Spring3引入了Spring表达式语言(Spring Expression Language,SpEL)。SpEL是一种强大的、简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。
字面值
我们可以在<property>元素的value属性中使用#{}界定符将值装配到Bean的属性中。

<property name="count" value="#{5}" />

浮点型数字一样可以出现在SpEL表达式中。

<property name="frequency" value="#{89.7}" />

表达式中的数字也可以实用科学计数法。

<property name="capacity" value="#{1e4}" />

这里将capacity属性设为了10000.0。
String类型的字面值可以使用单引号或者双引号作为字符串界定符。

<property name="name" value="#{'moonlit'}" />

或者

<property name="name" value='#{"moonlit"}' />

还可以使用布尔值true和false。

<property name="enabled" value="#{true}" />

引用Bean
新建Poem类。

package com.moonlit.myspring;

public class Poem {
private static String[] LINES = {
"床前明月光,",
"疑是地上霜。",
"举头望明月,",
"低头思故乡。",
};
public void perform() {
for (String line : LINES)
System.out.println(line);
}
}

新建Poet类。

package com.moonlit.myspring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Poet {
private Poem poem;
public void recite() {
System.out.println("the poet begin to recite...");
poem.perform();
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-idol.xml");
Poet poet = (Poet) context.getBean("poet");
poet.recite();
}
public Poem getPoem() {
return poem;
}
public void setPoem(Poem poem) {
this.poem = poem;
}
}

并在xml文件中声明他们对应的Bean。

<bean id="poem" class="com.moonlit.myspring.Poem" />
<bean id="poet" class="com.moonlit.myspring.Poet">
<property name="poem" value="#{poem}">
</bean>

poet通过SpEL获得了poem这个Bean。
此时运行Poet程序得到结果如下:

the poet begin to recite...
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。

还可以通过SpEL获得bean的对象。

<property name="poem" value="#{poet.poem}" />

通过这句话就获得了poet的poem。
还可以通过SpEL获得bean的对象。

<property name="poem" value="#{poet.getPoem()}" />

通过这句话通过poet.getPoem()获得poet的poem。
在SpEL中避免抛出空指针异常(NullPointException)的方法是使用null-safe存取器:

<property name="song" value="#{songSelector.selectSong()?.toUpperCase()}" />

这里我们使用 ?. 运算符代替点(.)来访问toUpperCase()方法。在访问邮编方法之前,该运算符会确保左边项的值不为null。所以,如果selectorSong返回null,SpEL就不再尝试调用toUpperCase()方法。
操作类
在SpEL中,使用T()运算符会调用类作用域的方法和常量。例如,在SpEL中使用Java的Math类,我们可以像下面的示例这样使用T()运算符:
T(java.lang.Math)
T()运算符的结果会返回一个java.lang.Math类对象。
装配PI或者一个随机值的配置方法如下:

    <property name="multiplier" value="#{T(java.lang.Math).PI}" />
<property name="randomNumber" value="#{T(java.lang.Math).random()}" />

SpEL上还可以执行bean值和数值之间的多种运算。
这里我定义一个Circle类:

package com.moonlit.myspring;

public class Circle {
private double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}

它的Bean声明如下:

  <bean id="circle" class="com.moonlit.myspring.Circle">
<property name="radius" value="2.1" />
</bean>

使用如下语句进行SpEL的数值运算示例:

<property name="total" value="#{circle.radius + 100.0}" />

“+”还可以进行字符串的连接。
比较值

<property name="hasCapacity" value="#{circle.radius lt 3.3}" />

操作一个表达式的值:
eq(==),lt(<),le(<=),gt(>),ge(>=)。
逻辑表达式:
and,or,not或!。
条件运算符:使用三元运算符

<property name="instrument" value="#{sonSelector.selecSOng()=='Jingle Bells'?piano:saxophone}" />

一个常见的三元运算符的使用场景是检查一个值是否为null。

<property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}" />

虽然以上配置可以正常工作,但这里kenny.song的引用重复了两次。SpEL提供了三元运算符的变体来简化表达式:

<property name="song" value="#{kenny.song ?: 'Greensleeves'}" />

在以上示例中,如果kenny.song不为null,那么表达式的求值结果是kenny.song,否则就是"Greensleeves"。当我们以这种方式使用时,“?:”通常被称为elvis运算符。这个名字的来历是,使用这个运算符来表示微笑表情(?:) ,头左转90度看)时,问号看起来像猫王(Elvis Presley)的头发。
SpEL支持正则表达式匹配

<property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+_]+@[a-zA-Z0-9.-]+\\.com'}" />

Hero类用于演示上述的大部分效果:

package com.moonlit.myspring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Hero {
private int count;
private double frequency;
private double capacity;
private String name;
private boolean enabled;
private Poem poem;
private double multiplier;
private double randomNumber;
private double total;
private boolean hasCapacity;
public void perform() {
System.out.println("count = " + count);
System.out.println("frequency = " + frequency);
System.out.println("capacity = " + capacity);
System.out.println("name = " + name);
System.out.println("enabled = " + enabled);
System.out.println("hero begin to recite...");
poem.perform();
System.out.println("pi = " + multiplier);
System.out.println("random number = " + randomNumber);
System.out.println("total = " + total);
System.out.println("hasCapacity = " + hasCapacity);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-idol.xml");
Hero hero = (Hero) context.getBean("hero");
hero.perform();
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public double getFrequency() {
return frequency;
}
public void setFrequency(double frequency) {
this.frequency = frequency;
}
public double getCapacity() {
return capacity;
}
public void setCapacity(double capacity) {
this.capacity = capacity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Poem getPoem() {
return poem;
}
public void setPoem(Poem poem) {
this.poem = poem;
}
public double getMultiplier() {
return multiplier;
}
public void setMultiplier(double multiplier) {
this.multiplier = multiplier;
}
public double getRandomNumber() {
return randomNumber;
}
public void setRandomNumber(double randomNumber) {
this.randomNumber = randomNumber;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public boolean isHasCapacity() {
return hasCapacity;
}
public void setHasCapacity(boolean hasCapacity) {
this.hasCapacity = hasCapacity;
} }

Hero.java

spring-idol.xml:

<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-init-method="defaultBorn"
default-destroy-method="defaultDead" > <bean id="poem" class="com.moonlit.myspring.Poem" />
<bean id="poet" class="com.moonlit.myspring.Poet">
<property name="poem" value="#{poem}" />
</bean>
<bean id="circle" class="com.moonlit.myspring.Circle">
<property name="radius" value="2.1" />
</bean>
<bean id="hero" class="com.moonlit.myspring.Hero">
<property name="count" value="#{5}" />
<property name="frequency" value="#{89.7}" />
<property name="capacity" value="#{1e4}" />
<!-- <property name="name" value="#{'moonlit'}" /> -->
<property name="name" value='#{"moonlit"}' />
<property name="enabled" value="#{true}" />
<!-- <property name="poem" value="#{poet.poem}" /> -->
<property name="poem" value="#{poet.getPoem()}" />
<property name="multiplier" value="#{T(java.lang.Math).PI}" />
<property name="randomNumber" value="#{T(java.lang.Math).random()}" />
<property name="total" value="#{circle.radius + 100.0}" />
<property name="hasCapacity" value="#{circle.radius lt 3.3}" />
</bean>
</beans>

spring-idol.xml

Spring学习笔记--Spring表达式语言SpEL的更多相关文章

  1. Spring学习记录(七)---表达式语言-SpEL

    SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...

  2. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  3. Spring学习笔记(14)——SpEL

    是什么 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts2x中使用的OGNL表达式语 ...

  4. Spring学习笔记--Spring简介

    1.spring:给软件行业带来了春天; 2.spring的理念:spring框架的初衷是使的现有的更加实用,spring不是创造轮子(技术或框架),而是使现有的轮子更好的运转;spring本身是一个 ...

  5. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  6. Spring学习笔记--Spring IOC

    沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...

  7. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

  8. Spring学习笔记-Spring之旅-01

    使用Spring简化JAVA开发 Spring的四种关键策略: ●基于POJO的轻量级和最小侵入式编程: ●通过依赖注入(DI)和面向接口实现松耦合: ●基于切面(AOP)和惯例进行声明式编程. ●通 ...

  9. Spring学习笔记——Spring中的BeanFactory与FactoryBean

    BeanFactory BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范.他的实现类有D ...

随机推荐

  1. iOS文件和目录操作,iOS文件操作,NSFileManager使用文件操作:

    NSFileManager常用的文件方法: -(NSData*)contentsAtPath:path 从一个文件中读取数据 -(BOLL)createFileAtPath:path contents ...

  2. 3DES加密算法32个字节

    简介 最近开发的一个项目,使用到了3DES加密算法,加密socket服务端和客户端通信的报文,因为加密秘钥是32个字节,结果折腾了一番,现在记录下来分享! 1.Des3EncryptUtils.jav ...

  3. json关键总结

    先引用 Newtonsoft.Json.Net20.dll //序列化对象的方法也非常的简单: string json = JsonConvert.SerializeObject(product); ...

  4. udev规则以及编写

    主要内容: udev简介 如何配置和使用udev 如何编写udev规则 字符串替换和匹配 udev主要作用 编写udev规则实例 难点解析 1. udev简介 1.1 什么是udev? udev是Li ...

  5. 内核定时器timer_list

    内核在时钟中断发生后执行检测各个定时器是否到期,到期后的定时器处理函数将作为软中断在底半部执行.实质上,时钟中断处理程序会唤起TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器.lin ...

  6. 9260与SAM-BA连接(转)

    对于AT91SAM9260的bootloader的烧写,常常会遇到这样的问题:对于干净的NAND FLASH(即没有烧写过任何东西),AT91SAM9260与sam-ba很容易连接成功,但当烧写过bo ...

  7. MySQL做为手动开启事务用法

    START TRANSACTION;INSERT INTO `t1` (t, t1) VALUES('124', NOW());ROLLBACK;COMMIT;

  8. wysiwyg+ckeditor 安装

    1.下载wysiwyg模块  https://drupal.org/project/wysiwyg 2.下载ckeditor 上传/sites/all/libraries 出现问题: 解决方法: 在文 ...

  9. C#里面的三种定时计时器:Timer

    在.NET中有三种计时器:1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会 ...

  10. 使用Backbone构建精美应用的7条建议

    我们在Bizzabo使用Backbone.js已经有两年的时间了.我们从一个小的网页应用为开始,这些小应用是由Backbone驱动的,而且他们看上去非常友好. Backbone天生就不固执己见.你从文 ...