Spring框架笔记(八)——SPEL(Spring表达式语言)
发布日期:2021-08-31 01:31:26 浏览次数:2 分类:技术文章

本文共 3232 字,大约阅读时间需要 10 分钟。

hot3.png

还记得当年的EL表达式吗?在各种格式规规矩矩的文件中,当需要引入一些动态特性的时候,总是喜欢提出某某EL表达式来帮助自己体现自己框架的强大性,Spring也不例外。

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。

语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL

SpEL 为 bean 的属性进行动态赋值提供了便利

通过 SpEL 可以实现:

    通过 bean 的 id 对 bean 进行引用

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

    计算表达式的值

    正则表达式的匹配

SpEL:字面量

字面量的表示:

整数:
小数:
科学计数法:
String可以使用单引号或者双引号作为字符串的定界符号:
 或 
Boolean:

SpEL:引用 Bean、属性和方法

引用其他对象:

170503_XGnO_1156339.png

引用其他对象的属性

170547_p1M1_1156339.png

调用其他方法,还可以链式操作

170611_qecC_1156339.png

170611_zbnH_1156339.png

调用静态方法或静态属性:通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性: 

170703_JV72_1156339.png

SpEL支持的运算符号

算数运算符:+, -, *, /, %, ^:

170823_tk01_1156339.png

加号还可以用作字符串连接:

170831_q24v_1156339.png

比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge

170841_hizT_1156339.png

逻辑运算符号: and, or, not, |

170934_2j7O_1156339.png

if-else 运算符:?: (ternary), ?: (Elvis)

170942_WIbY_1156339.png

if-else 的变体

170950_VhL9_1156339.png

正则表达式:matches

170959_OxK0_1156339.png

下面我们看一个综合的例子:

三个类的定义如下:

package com.happyBKs.spel;public class AddressBean {		String city;	String street;		public AddressBean() {		super();		// TODO Auto-generated constructor stub	}	public AddressBean(String city, String street) {		super();		this.city = city;		this.street = street;	}	public String getCity() {		return city;	}	public void setCity(String city) {		this.city = city;	}	public String getStreet() {		return street;	}	public void setStreet(String street) {		this.street = street;	}	@Override	public String toString() {		return "AddressBean [city=" + city + ", street=" + street + "]";	}}
package com.happyBKs.spel;public class CarBean {	String brand;	double price;	double tyrePerimeter;	public double getTyrePerimeter() {		return tyrePerimeter;	}	public void setTyrePerimeter(double tyrePerimeter) {		this.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 CarBean() {		super();	}	@Override	public String toString() {		return "CarBean [brand=" + brand + ", price=" + price				+ ", tyrePerimeter=" + tyrePerimeter + "]";	}	}
package com.happyBKs.spel;public class PersonBean {		String name;	CarBean car;		public String getCity() {		return city;	}	public void setCity(String city) {		this.city = city;	}	public String getInfo() {		return info;	}	public void setInfo(String info) {		this.info = info;	}	//引用address bean的city属性	String city;	//根据car的price确定info : car 的价格大于等于300000 则是高富帅,否则是土豪	String info;		public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public CarBean getCar() {		return car;	}	public void setCar(CarBean car) {		this.car = car;	}	@Override	public String toString() {		return "PersonBean [name=" + name + ", car=" + car + ", city=" + city				+ ", info=" + info + "]";	}	public PersonBean() {		super();		// TODO Auto-generated constructor stub	}}

springIOC容器配置文件spring-spel.xml:

= 300000 ? '高富帅' : '土豪'}">

测试程序:

@Test	public void test1()	{		ApplicationContext ac=new ClassPathXmlApplicationContext("beans-spel.xml");		AddressBean ab=(AddressBean)ac.getBean("addressId");		System.out.println(ab);				CarBean cb=(CarBean)ac.getBean("carId");		System.out.println(cb);				PersonBean pb=(PersonBean)ac.getBean("person");		System.out.println(pb);			}

转载于:https://my.oschina.net/happyBKs/blog/480472

转载地址:https://blog.csdn.net/weixin_34056162/article/details/91944541 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
下一篇:在Fedora21下搭建code::blocks开发环境

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月18日 20时08分49秒