Spring—SpEL

Spring表达式语言——SpEL

Spring表达式语语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言。其为Bean的属性进行动态赋值提供了便利

SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL。

通过SpEL可以实现:

  • 通过bean的id对bean进行引用
  • 调用方法以及引用对象中的属性
  • 计算表达式的值
  • 正则表达式的匹配

1. 字面量:

为字面量赋值是以下形式:

整数:<property name = "xx" value = "#{5}"/>
小数:<property name = "xx" value = "#{89.7}"/>
科学技术法:<property name = "xx" value = "#{1e4}"/>

Spring可以使用单引号或双引号作为字符串的定界符号:

<property name = "xx" value = "#{'tom'}"/>
或者:<property name = "xx" value = "#{"Tom"}"/>

Boolean类型:

<property name = "xx" value = "#{false}"/>

2. 引用Bean,属性和方法

2.1 应用其他对象:

<!-- 通过value属性和SpEL配置Bean直接的应用关系-->
<property name = "prefix" value = "#{prefixGenerator"}></property>

2.2 引用其他对象的属性

<!-- 通过value属性和SpEL配置suffix属性值为另一个Bean的suffix属性赋值-->
<property name = "suffix" value = "#{sequenceGenerator.suffix}"></property>

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

<!-- 通过value属性和SpEL配置suffix属性值为另一个Bean的方法的返回值-->
<property name = "suffix" value = "#{sequenceGenerator.toString()}"></property>

2.4 调用静态方法或静态属性

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

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

2.5 示例

新建Address,Car,Person和Main

public class Address {
	private String city, 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 "Address [city=" + city + ", street=" + street + "]";
	}
	
}



public class Car {
	private String brand;
	private double price;
	private double 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 double getTyrePerimeter() {
		return tyrePerimeter;
	}
	public void setTyrePerimeter(double tyrePerimeter) {
		this.tyrePerimeter = tyrePerimeter;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + ", tyrePerimeter=" + tyrePerimeter + "]";
	}
}





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

beans-spel.xml文件配置和注释如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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.xsd">

	<bean id = "address" class = "com.spring.beans.spel.Address">
		<!-- 使用spel为属性赋一个字面值 -->
		<property name="city" value = "#{'Beijing'}"></property>
		<property name="street" value = "WuDaoKou"></property>
	</bean>
	
	<bean id = "car" class = "com.spring.beans.spel.Car">
		<property name="brand" value = "Audi"></property>
		<property name="price" value = "500000"></property>
		<!-- 使用spel引用类的静态 属性 -->
		<property name="tyrePerimeter" value = "#{T(java.lang.Math).PI * 80}"></property>
	</bean>
	
	<bean id = "person" class = "com.spring.beans.spel.Person">
		<!-- 使用spel引用其他的bean -->
		<property name="car" value = "#{car}"></property>
		
		<!-- 使用spel引用其他的bean的属性 -->
		<property name="city" value = "#{address.city}"></property>
		
		<!-- 在spel中使用运算符 -->
		<property name = "info" value = "#{car.price > 300000 ? '金领' : '白领'}"></property>
		
		<!--  -->
		<property name="name" value = "Tom"></property>
	</bean>
	
	
</beans>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值