SpEL(1)

概述

Spring表达式语言(Spring Expression Language)缩写为“SpEL”,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能整合

SpEL是单独模块只依赖core模块,可单独使用

作用

  1. 基本表达式
    字面量表达式、关系,逻辑与算数运算表达式、字符串连接、截取表达式、三目运算、Elibis表达式、正则表达式、括号优先级表达式;
  2. 类相关表达式
    类类型表达式、类实例化、instanceof表达式、变量定义引用、赋值表达式、自定义函数、对象属性存取、安全导航表达式、对象方法调用、bean引用;
  3. 集合相关表达式
    内联List、内联数组、集合、字典访问、列表字典数组修改、集合投影、集合选择’
  4. 其他表达式
    模板表达式

注意:SpEL表达式中的关键字是不区分大小写的

Hello World

第一种
SpELHelloTest.java

package com.test;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class SpELHelloTest {
    @Test
public void SpELHelloTest(){
    ExpressionParser parser=new SpelExpressionParser();
    Expression expression=parser.parseExpression("('Hello'+' World').concat(#end)");
    EvaluationContext context =new StandardEvaluationContext();
    context.setVariable("end", "!");
    Assert.assertTrue("Hello World!".equals(expression.getValue(context)));
}
}

步骤
1. 构造解析器
SpEL使用ExpressionParser接口表示解析器,提供了SpelExpressionParser实现
2. 解析器解析字符串表达式
使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象
3. 构造上下文
准备变量定义等表达式需要的上下文数据
4. 根据上下文得到表达式运算后的值
通过Expression接口的getValue方法根据上下文获取表达式值

第二种
SpELHelloTest .java

package com.test;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class SpELHelloTest {
    @Test
public void SpELHelloTest(){
    ExpressionParser parser=new SpelExpressionParser();
    //ParserContext 接口用于定义字符串是不是表达式以及模板的开始和结束字符
    ParserContext parserContext=new ParserContext() {
        //是否是模板
        @Override
        public boolean isTemplate() {
            return true;
        }
        //结束字符
        @Override
        public String getExpressionSuffix() {
            return "}";
        }
        //开始字符
        @Override
        public String getExpressionPrefix() {
            return "#{";
        }
    };
    String template="#{'Hello '}#{'World!'}";
    //Expression expression=parser.parseExpression("('Hello'+' World').concat(#end)");
    Expression expression=parser.parseExpression(template, parserContext);
    //EvaluationContext context =new StandardEvaluationContext();
    //context.setVariable("end", "!");
    Assert.assertTrue("Hello World!".equals(expression.getValue()));
}
}

SpEL原理及接口

  1. 表达式:“做什么”
  2. 解析器:“谁来做”,将字符串表达式解析为表达式对象
  3. 上下文:“在哪做”,表达式对象的执行环境,该环境可能定义了变量、自定义函数、类型转换等

ExpressionParser.class

 public abstract interface ExpressionParser
{
  public abstract Expression parseExpression(String paramString)
    throws ParseException;

  public abstract Expression parseExpression(String paramString, ParserContext paramParserContext)
    throws ParseException;
}
  • ExpressionParser接口表示解析器,SpelExpressionParser为实现,其中ParserContext 接口用于定义字符串是不是表达式以及模板的开始和结束字符;
  • EvaluationContext接口表示上下文环境,StandardEvaluationContext为实现,setRootObject设置跟对象,setVariable设置自定义变量,registerFunction注册自定义函数;
  • Expression 接口表示表达式对象,getVlaue()取得表达式的值,setValue()设置表达式的值;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值