07 SpEL

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;/*
* @Author Sheng WenZeng
* @Date 2019/8/11 8:46
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName Address
* @Description TODO
* @Date 2019/8/11 8:46
* @Version 1.0
*/
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;/*
* @Author Sheng WenZeng
* @Date 2019/8/11 8:44
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName Car
* @Description TODO
* @Date 2019/8/11 8:44
* @Version 1.0
*/
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;/*
* @Author Sheng WenZeng
* @Date 2019/8/11 8:44
* @Version 1.0
*/

/**
* @author Sheng Wenzeng
* @ClassName Person
* @Description TODO
* @Date 2019/8/11 8:44
* @Version 1.0
*/
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;/*
* @Author Sheng WenZeng
* @Date 2019/8/11 8:49
* @Version 1.0
*/

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author Sheng Wenzeng
* @ClassName Main
* @Description TODO
* @Date 2019/8/11 8:49
* @Version 1.0
*/
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">
<!--使用spel表达式引用类中的静态方法-->
<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中的属性:address.city; 使用if-else语句:car_1.price>10000? '金领':'白领'-->
<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的

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×