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.javapublic 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.Personpublic 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.Personpublic class Address {private String city;private String street;}// src/com.lijunyang.model.Personpublic 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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>
