1.SpEL简介

Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法上类似于EL:SpEL使用#{...}作为界定符,所有在大框号中的字符都将被认为是SpEL,SpEL为bean的属性进行动态赋值提供了便利。

2.SpEL用法

SpEL有以下几种用法:

1)引用字面量的值

  2)通过bean的id对bean进行引用

3)引用类的静态属性

  4)调用方法以及引用对象中的属性

  5)计算表达式的值

  6)正则表达式的匹配

3.SpEL应用

下面我们就来实现以上的几种用法,首先我们先创建几个实体类:

Person类

 public class Person {
private String name;
private Car car;
//应用address bean的city属性
private String city;
//根据car的price确定info,car的price>300000 金领 否则白领 public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} private String info; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", car=" + car +
", city='" + city + '\'' +
", info='" + info + '\'' +
'}';
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
}
}

Car类

 public class Car {
private String brand;
private double price;
//轮胎的周长
private double tyrePerimeter; @Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", tyrePerimeter=" + tyrePerimeter +
'}';
} public String getBrand() {
return brand;
} public void setBrand(String brand) {
this.brand = brand;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} public Car() {
System.out.println("Car's Constructor");
} public double getTyrePerimeter() {
return tyrePerimeter;
} public void setTyrePerimeter(double tyrePerimeter) {
this.tyrePerimeter = tyrePerimeter;
}
}

Address类

 public class Person {
private String name;
private Car car;
//应用address bean的city属性
private String city;
//根据car的price确定info,car的price>300000 金领 否则白领 public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} private String info; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", car=" + car +
", city='" + city + '\'' +
", info='" + info + '\'' +
'}';
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
}
}

1)引用字面量

可以直接通过#{‘字面量的值’}方式对bean的属性进行注入,但是这种方式本身意义不大,因为在value属性中直接填写value的值即可。

 <bean id="address" class="com.wzy.spel.Address">
<!--使用spel为属性赋值一个字面值-->
<property name="city" value="#{'BeiJing'}"/>
<property name="street" value="WUDAOKOU"/>
</bean>

2)引用类的静态属性与计算表达式的值

声明一个Car类型的bean,并且应用Math类中的今天变量PI,来计算汽车轮胎的周长

 <bean id="car" class="com.wzy.spel.Car">
<property name="brand" value="Audi"/>
<property name="price" value="300000"/>
<!--使用spel 引用类的静态属性-->
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI * 80}"/>
</bean>

3)引用其他的bean

声明一个Person类型的Bean,并使用SpEL表达式注入属性。

 <bean id="person" class="com.wzy.spel.Person">
<!--使用spEL来引用其他的Bean-->
<property name="car" value="#{car}"/>
<!--使用spEl引用其他Bean的属性-->
<property name="city" value="#{address.city}"/>
<property name="name" value="wzy"/>
<!--在spEL中使用运算符,如果车的价格大于三十万则说明是金领,否则是白领-->
<property name="info" value="#{car.price > 300000 ? '金领' : '白领'}"/>
</bean>

编写测试类:

 public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-spel.xml");
//获取address对象
Address address = (Address) ctx.getBean("address");
System.out.println(address);
//获取car对象
Car car = (Car) ctx.getBean("car");
System.out.println(car);
//获取person对象
Person person = (Person) ctx.getBean("person");
System.out.println(person);
}
}

执行结果:

Spring基础13——Spring表达式语言:SpEL的更多相关文章

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

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

  2. 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

  3. Sping表达式语言--SpEL

    Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...

  4. Spring表达式语言SpEL

    Spring表达式语言,简称SpEL,是一个支持运行时查询和操作对象图的强大的表达式语言.语法类似于EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean属 ...

  5. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  6. Spring表达式语言SpEL简单介绍

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...

  7. Spring表达式语言:SpEl

    概念: 是一个支持运行时查询和操作的对象图的强大的表达式语言. 语法类似于EL:SpEl使用#{ ...}作为定界符,所有在大括号中的 字符都将被认为是SpEl SpEl为bean的属性进行动态赋值提 ...

  8. Spring3表达式语言(SpEL)学习笔记

    最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...

  9. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

随机推荐

  1. 采用.bat批处理命令快速设置Java环境变量

    背景: java课程培训,每次到机房需要重新安装JDK,每次都采用图形界面进行操作比较麻烦(慢),于是在网上查了一下CMD命令设置系统环境变量的方法,再次记录下来. 设置方法: 1.找到JDK安装路径 ...

  2. x-pack邮件报警功能

    1):修改elasticsearch.yml xpack.notification.email.account: work:   profile: standard   email_defaults: ...

  3. wannafly 挑战赛8 E 小G的项链(manecher)

    链接:https://www.nowcoder.com/acm/contest/57/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

  4. 【Python】学习笔记十二:模块

    模块(module) 在Python中,一个.py文件就是一个模块.通过模块,你可以调用其它文件中的程序 引入模块 先写一个first.py文件,内容如下: def letter(): print(' ...

  5. linux下libusb的安装与测试

    0.libusb的介绍:参考[1] 1.环境:vmware_fedora_10(linux-2.6.x) 2.获取源代码:http://sourceforge.net/projects/libusb/ ...

  6. eclipse添加约束文件

    DTD 类型约束文件     1. Window->Preferences->XML->XML Catalog->User Specified Entries窗口中,选择Add ...

  7. 2018.03.29 python-pandas transform/apply 的使用

    #一般化的groupby方法:apply df = pd.DataFrame({'data1':np.random.rand(5), 'data2':np.random.rand(5), 'key1' ...

  8. 正则的?:pattern, ?=pattern, ?!pattern学习整理

    真正学习这次正则知识前,我是被这道题给难住了: # 目标文本 str1 = "ever1, ever2, never1, never2, never3, forever1, forever2 ...

  9. opencv.js小项目demo

    1.博客连接 https://blog.csdn.net/weixin_38361925/article/details/82528529 2.demo连接 https://github.com/mt ...

  10. 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量

    在gemfield的<从pthread到QThread>一文中我们了解了线程的基本使用,但是有一大部分的内容当时说要放到这片文章里讨论,那就是线程的同步问题.关于这个问题,gemfield ...