Spring 表达式语言(SpEL)
最近总想着发点什么,一直没时间
发个干货SPLE证明我还活着……佛系修仙ing
Spring表达式语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言。其语法类似于统一EL,但提供了额外特性,显式方法调用和基本字符串模板函数。
同很多可用的Java 表达式语言相比,例如OGNL,MVEL和JBoss
EL,SpEL的诞生是为了给Spring社区提供一个可以给Spring目录中所有产品提供单一良好支持的表达式语言。其语言特性由Spring目录中的项目需求驱动,包括基于eclipse的SpringSource套件中的代码补全工具需求。那就是说,SpEL是一个基于技术中立的API允许需要时与其他表达式语言集成。
SpEL作为Spring目录中表达式求值的基础,它并不是直接依赖于Spring而是可以被独立使用。为了能够自包含,本章中的许多示例把SpEL作为一个独立的表达式语言来使用。这就需要创建一些如解析器的引导基础组件类。大多数Spring用户只需要为求值编写表达式字符串而不需要关心这些基础组件。一个典型的使用例子是集成SpEL和创建基于XML或注解的bean定义
效果图
这是一个很干货的测试
Address.java
private String city;
private String street;
Car.java
private String brand;
private double price;
//轮胎周长
private double tyrePerimeter;
Person.java
private String name;
private Car car;
//引用address的Bean的city属性
private String city;
//通过Car的price确定工作地位: car的price >= 30000 金领
//否则为白领
private String info;
Bean-spel.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.benny.spring.bean.spel.Address" id="address">
<!-- 使用spel字面值 -->
<property name="city" value="#{'beijing'}"></property>
<property name="street" value="wudaokou"></property>
</bean>
<bean class="com.benny.spring.bean.spel.Car" id="car">
<property name="brand" value="一汽"></property>
<property name="price" value="5000000"></property>
<!-- 使用spel引用类的静态属性 -->
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI * 80}"></property>
</bean>
<bean class="com.benny.spring.bean.spel.Person" id="person">
<!-- 引用其他的Bean 相当于ref -->
<property name="car" value="#{car}"></property>
<!-- 引用其他的属性 -->
<property name="city" value="#{address.city}"></property>
<!-- 比较运算符 -->
<property name="info" value="#{car.price > 30000? '金领' : '白领'}"></property>
<property name="name" value="zhangsan"></property>
</bean>
</beans>
Main.java
package com.benny.spring.bean.spel;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-spel.xml");
Address address = (Address) ctx.getBean("address");
System.out.println(address);
Car car = (Car) ctx.getBean("car");
System.out.println(car);
Person person = (Person) ctx.getBean("person");
System.out.println(person);
}
}
四月 13, 2019 9:05:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org[email protected]6193b845: startup date [Sat Apr 13 21:05:52 CST 2019]; root of context hierarchy
四月 13, 2019 9:05:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [bean-spel.xml]
Address [city=beijing, street=wudaokou]
Car [brand=一汽, price=5000000.0, tyrePerimeter=251.32741228718345]
Person [name=zhangsan, car=Car [brand=一汽, price=5000000.0, tyrePerimeter=251.32741228718345], city=beijing, info=金领]