SpEl
- Spring 表达式语言:是一个支持运行时查询和操作对象图的强大表达式语言。
- 语法类似EL:SpEL使用#{…}作为界定符,所有在大括号中的字符都将被认为是SpEL
- SpEL为bean的属性进行动态赋值提供了便利
通过SpEL可以实现:
通过bean的id对bean进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配字面量的表示:
数字
- 小数
- 科学计数法
- String 可以使用单引用或者双引号
- Boolean通过id引用其他对象
引用其他对象
- 引用其他对象的属性
- 调用其他方法,还可以链式操作SpEL支持的运算符号:+,-,*,/,%,^ (+号还可以做字符串连接),<,>,==,<=,=>,lt,gt,eq,le,ge
计算运算符 +,-,*,/,%,^
- 字符串连接运算符 +
- 条件运算符 <,>,==,<=,=>,lt,gt,eq,le,ge
- 逻辑运算符 and,or,not,|
- 三元运算符 条件表达式 ? 表达式1 : 表达式2
- 三元运算符变体 条件表达式 ?: 表达式
- 正则表达式 matches :引用Bean的属性和方法
调用静态方法或静态属性:通过T()调用一个类的静态方法,它将返回一个Class Object,然后在调用响应的方法或属性
// src/com.lijunyang.test.Main.java
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
Address address = (Address) ctx.getBean("address");
System.out.println(address);
Car car = (car) ctx.getBean("car");
System.out.println(car);
Preson preson = (Preson) ctx.getBean("preson");
System.out.println(preson);
}
}
// src/com.lijunyang.model.Person
public class Person {
private String name;
// private Address address;
// 引用 Address的city属性
private String city;
// 根据car的price确定info:car的price>= 300000: 金领
// 否则为:白领
private String info;
private Car car;
}
// src/com.lijunyang.model.Person
public class Address {
private String city;
private String street;
}
// src/com.lijunyang.model.Person
public class Car {
private String brand;
private double price;
private double tyrePerimeter;
}
// src/beans-autowire.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="preson" class="com.lijunyang.model.Preson">
<!-- 使用Spel 来应用其他的bean -->
<property name="car" value="#{car}" />
<!-- 使用Spel 来应用其他bean的属性 -->
<property name="city" value="#{address.city}" />
<!-- 在Spel 中使用运算符 -->
<property name="info" value="#{car.price > 300000 ? '金领' : '白领'}" />
<property name="name" value="Tom" />
</bean>
<bean id="address" class="com.lijunyang.model.Address">
<!-- 使用 spel 为属性赋值一个字面量 -->
<property name="city" value="#{'BeiJing'}" />
<property name="street" value="WuDaoKou" />
</bean>
<bean id="car" class="com.lijunyang.model.Car">
<property name="brand" value="Audi" />
<property name="price" value="500000" />
<!-- 使用SpEl 引用类的静态属性 -->
<property name="tyrePerimeter" value="#{T(Java.lang.Math).PI * 80}" />
</bean>
</beans>