SpEL:Spring表达式语言,是一个支持运行时查询和操作对象图的强大表达式语言
语法类似于EL:SpEL使用#{...}
作为定界符,所有在大括号中的字符都被认为是SpEL
SpEL为Bean的属性进行动态赋值提供了便利
通过SpEL可以实现:
- 通过Bean的id对Bean进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
SpEL字面量(意义不大):
- 整数:
<property name = "count" value="#{5}"/>
- 小数:
<property name = "frequency" value="#{89.7}"/>
- 科学计数法:
<property name = "capacity" value="#{1e4}"/>
- String可以使用单引号或者双引号作为字符串的定界符号:
<property name = "name" value="#{'Chuck'}"/>
或者:<property name = "name" value='#{"Chuck"}'/>
- Boolean:
<property name="enabled" value="#{false}"/>
引用Bean、属性和方法
- 引用其他对象
- 引用其他对象的属性
- 调用其他方法,还可以链式操作
支持的运算符号
- 算数运算符:
+
,-
,*
,/
,%
,^
- 加号可拼接字符串
- 比较运算符:
<
,>
,==
,<=
,>=
,lt
,gt
,eg
,le
,ge
- 逻辑运算符:
and
,or
,not
- if-else运算符:
?:(tenmary),?:(Elvis)
- if-else的变体
- 正则表达式:matches
- 调用静态方法或静态属性:通过T()调用一个类的静态方法,他将返回一个Class Object,然后再调用相应的方法或属性
Address.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package spel;
public class Address { private String city; private String 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 + '\'' + '}'; } }
|
Car.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| package spel;
public class Car { private double price; private String brand; private int typePerimeter;
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 int getTypePerimeter() { return typePerimeter; }
public void setTypePerimeter(int typePerimeter) { this.typePerimeter = typePerimeter; }
@Override public String toString() { return "Car{" + "brand='" + brand + '\'' + ", price=" + price + ", typePerimeter=" + typePerimeter + '}'; } }
|
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package spel;
public class Person { private String name; private Car car; private String city; private String info;
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", car=" + car + ", city='" + city + '\'' + ", info='" + info + '\'' + '}'; }
public void setName(String name) { this.name = name; }
public void setCar(Car car) { this.car = car; }
public void setCity(String city) { this.city = city; }
public void setInfo(String info) { this.info = info; } }
|
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package spel;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spel/spel.xml"); Car car = (Car) applicationContext.getBean("car_1"); System.out.println(car);
Address address = (Address) applicationContext.getBean("address"); System.out.println(address);
Person person = (Person) applicationContext.getBean("person"); System.out.println(person); } }
|
spel.xml
1 2 3 4 5 6 7 8 9 10 11
| <?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car_1" class="spel.Car" p:brand="Audi" p:price="300000" p:typePerimeter="#{T(Math).PI*80}"/> <bean id="address" class="spel.Address" p:city="HeFei" p:street="ShuangDun"/> <bean id="person" class="spel.Person" p:car="#{car_1}" p:city="#{address.city}" p:name="Sheng" p:info="#{car_1.price>10000? '金领':'白领'}"/> </beans>
|
运行结果:
1 2 3
| Car{brand='Audi', price=300000.0, typePerimeter=251} Address{city='HeFei', street='ShuangDun'} Person{name='Sheng', car=Car{brand='Audi', price=300000.0, typePerimeter=251}, city='HeFei', info='金领'}
|
注意:引用其他Bean的属性时,需要被引用的Bean的类中有getter方法或者要引用的属性是public的