Spring表达式语言(Spring Expression Language)简称:SpEL
课程概要:
- Spring表达式语言的入门介绍
- Spring表达式语言的操作范围
- Spring表达式语言的运算符
- Spring表达式语言的集合操作
一.Spring表达式语言入门级介绍
1.基本概述
Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,他能在运行时构建复杂表达式、存取对象属性、对象方法调用等等,并且能与Spring功能完美整合。表达式语言给静态Java语言增加了动态的功能,表达式语言是单独的模块,他只依赖与核心的模块,不依赖与其他模块,能够单独的使用。表达式语言通常是以最简单的形式完成最复杂的工作来减少我们的工作量,Spring语言主要支持如下的表达式。
- 基本表达式
- 类相关表达式
- 集合相关表达式
- 其他表达式
注:Spring的表达式不区分大小写
2.示例分析
@H_301_47@
- public class SpelTest {
- public static void main(String[] args){
- //创建解析器
- ExpressionParser parser=new SpelExpressionParser();
- //解析表达式
- Expression expression=
- parser.parseExpression("('Hello'+'World').concat(#end)");
- //构造上下文
- EvaluationContext context=new StandardEvaluationContext();
- //为end参数值来赋值
- context.setVariable("end","!");
- //打印expression表达式的值
- System.out.println(expression.getValue(context));
- }
- }
3.工作原理
在介绍Spring表达式语言工作原理之前,先介绍一下一些基本概念:
- 表达式:表达式语言的核心,即“干什么”
- 解析器:用于将字符串表达式解析为表达式对象,即“谁来干”
- 上下文:表达式语言执行的环境,该环境可能定义变量,可能定义自定义函数,也可以提供类型转换等等,即“在哪里干”
- 根对象即活动上下文对象:根对象是默认的活动上下文对象,活动上下文对象表示了当前操作对象。即“对谁干”
接下来让我们来看一下Spring是如何工作的:
1.首先需要定义一个表达式
2.然后得定义解析器ExpressionParser,Spring语言提供了默认的实现即SpelExpressionParser。
①SpelExpressionParser解析器内部进行词法分析,即把字符串流分析为记号流。记号在SpEL当中使用类来进行表示。
②有了记号流之后,解析器便可根据记号流生成内部抽象语法树。在SpEL当中,语法树节点使用SpelNode接口进行实现。
3.下一步定义上下文对象,这一步是可选的。SpEL使用EvaluationContext接口来表示上下文对象。他主要用于设置根对象,自定义变量、自定义函数、类型转换器等等。SpEL提供的默认实现即为StandardEvaluationContext
接下来看以下SpEL的主要接口
- ExpressionParser接口:表示解析器
- EvaluationContext接口:表示上下文环境
- Expression接口:表示的是表达式对象
4.配置风格
以上是使用Java语言配置Spring表达式语言,
接下来我们使用XML来配置。
XML风格的配置:
SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有ApplicationContext实现默认支持SpEL,获取根对象属性其实是获取容器中的Bean
我们来看一个示例:
- <?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 id="world" class="java.lang.String">
- <constructor-arg value="#{' World!'}"/>
- </bean>
- <!--方式一-->
- <bean id="hello1" class="java.lang.String">
- <constructor-arg value="#{'Hello '}#{world}"/>
- </bean>
- <!--方式二
- 注意:Spring语言不支持嵌套,即在一个#之内又有一个#
- <constructor-arg value="#{'Hello '#{world}}"/>-->
- <bean id="hello2" class="java.lang.String">
- <constructor-arg value="#{'Hello '+world}"/>
- </bean>
- <!--方式三-->
- <bean id="hello3" class="java.lang.String">
- <constructor-arg value="#{'Hello '+@world}"/>
- </bean>
- </beans>
接下来我们创建一个测试类来测试下各个bean的值
@H_301_47@
- public class XmlExpression {
- public static void main(String[] args){
- ApplicationContext ctx=
- new FileSystemXmlApplicationContext("src/conf/conf-spel.xml");
- String hello1=ctx.getBean("hello1",String.class);
- String hello2=ctx.getBean("hello2",String.class);
- String hello3=ctx.getBean("hello3",String.class);
- System.out.println(hello1);
- System.out.println(hello2);
- System.out.println(hello3);
- }
- }