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,然后在调用响应的方法或属性

  1. // src/com.lijunyang.test.Main.java
  2. public class Main {
  3. public static void main(String[] args) {
  4. ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
  5. Address address = (Address) ctx.getBean("address");
  6. System.out.println(address);
  7. Car car = (car) ctx.getBean("car");
  8. System.out.println(car);
  9. Preson preson = (Preson) ctx.getBean("preson");
  10. System.out.println(preson);
  11. }
  12. }
  13. // src/com.lijunyang.model.Person
  14. public class Person {
  15. private String name;
  16. // private Address address;
  17. // 引用 Address的city属性
  18. private String city;
  19. // 根据car的price确定info:car的price>= 300000: 金领
  20. // 否则为:白领
  21. private String info;
  22. private Car car;
  23. }
  24. // src/com.lijunyang.model.Person
  25. public class Address {
  26. private String city;
  27. private String street;
  28. }
  29. // src/com.lijunyang.model.Person
  30. public class Car {
  31. private String brand;
  32. private double price;
  33. private double tyrePerimeter;
  34. }
  35. // src/beans-autowire.xml
  36. <?xml version="1.0" encoding="UTF-8"?>
  37. <beans xmlns="http://www.springframework.org/schema/beans"
  38. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  39. xmlns:context="http://www.springframework.org/schema/context"
  40. xsi:schemaLocation="http://www.springframework.org/schema/beans
  41. http://www.springframework.org/schema/beans/spring-beans.xsd
  42. http://www.springframework.org/schema/context
  43. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  44. <bean id="preson" class="com.lijunyang.model.Preson">
  45. <!-- 使用Spel 来应用其他的bean -->
  46. <property name="car" value="#{car}" />
  47. <!-- 使用Spel 来应用其他bean的属性 -->
  48. <property name="city" value="#{address.city}" />
  49. <!-- Spel 中使用运算符 -->
  50. <property name="info" value="#{car.price > 300000 ? '金领' : '白领'}" />
  51. <property name="name" value="Tom" />
  52. </bean>
  53. <bean id="address" class="com.lijunyang.model.Address">
  54. <!-- 使用 spel 为属性赋值一个字面量 -->
  55. <property name="city" value="#{'BeiJing'}" />
  56. <property name="street" value="WuDaoKou" />
  57. </bean>
  58. <bean id="car" class="com.lijunyang.model.Car">
  59. <property name="brand" value="Audi" />
  60. <property name="price" value="500000" />
  61. <!-- 使用SpEl 引用类的静态属性 -->
  62. <property name="tyrePerimeter" value="#{T(Java.lang.Math).PI * 80}" />
  63. </bean>
  64. </beans>