SpEL表达式思考


SpEL表达式思考

概念

由常量,变量,运算符构成的一个含有返回值的式子,即为表达式

表达式的概念很简单,那么我们下面看看一些复杂的表达式把

SpEL支持如下表达式:

  • 一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;

  • 二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;

  • 三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;

  • 四、其他表达式:模板表达式。

SpEL提供简单的接口从而简化用户使用,在介绍原理前让我们学习下几个概念:

  • 一、表达式:表达式是表达式语言的核心,所以表达式语言都是围绕表达式进行的,从我们角度来看是“干什么”;

  • 二、解析器:用于将字符串表达式解析为表达式对象,从我们角度来看是“谁来干”;

  • 三、上下文:表达式对象执行的环境,该环境可能定义变量、定义自定义函数、提供类型转换等等,从我们角度看是“在哪干”;

  • 四、根对象及活动上下文对象:根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象,从我们角度看是“对谁干”。

接下来让我们看下SpEL的主要接口吧:

  • 1)ExpressionParser接口:表示解析器,默认实现是org.springframework.expression.spel.standard包中的SpelExpressionParser类,使用parseExpression方法将字符串表达式转换为Expression对象,对于ParserContext接口用于定义字符串表达式是不是模板,及模板开始与结束字符:

    public interface ExpressionParser {  
        Expression parseExpression(String expressionString);  
        Expression parseExpression(String expressionString, ParserContext context);  
    }  
    

    来看下示例:

    @Test  
    public void testParserContext() {  
        ExpressionParser parser = new SpelExpressionParser();  
        ParserContext parserContext = new ParserContext() {  
            @Override  
            public boolean isTemplate() {  
                return true;  
            }  
            @Override  
            public String getExpressionPrefix() {  
                return "#{";  
            }  
            @Override  
            public String getExpressionSuffix() {  
                return "}";  
            }  
        };  
        String template = "#{'Hello '}#{'World!'}";  
        Expression expression = parser.parseExpression(template, parserContext);  
        Assert.assertEquals("Hello World!", expression.getValue());  
    }  
    

    在此我们演示的是使用ParserContext的情况,此处定义了ParserContext实现:定义表达式是模块,表达式前缀为“#{”,后缀为“}”;使用parseExpression解析时传入的模板必须以“#{”开头,以“}”结尾,如”#{‘Hello ‘}#{‘World!’}”。
    默认传入的字符串表达式不是模板形式,如之前演示的Hello World。

  • 2)EvaluationContext接口:表示上下文环境,默认实现是org.springframework.expression.spel.support包中的StandardEvaluationContext类,使用setRootObject方法来设置根对象,使用setVariable方法来注册自定义变量,使用registerFunction来注册自定义函数等等。

  • 3)Expression接口:表示表达式对象,默认实现是org.springframework.expression.spel.standard包中的SpelExpression,提供getValue方法用于获取表达式值,提供setValue方法用于设置对象值。

了解了SpEL原理及接口,接下来的事情就是SpEL语法了。


文章作者: dhslegen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dhslegen !
评论
 上一篇
wsl windows terminal 美化教程 wsl windows terminal 美化教程
配置 windows terminal 安装Powerline Fonts许多主题都需要安装Powerline Fonts字体,以正确渲染字体。安装方法如下: # 拉取 git clone https://github.com/powerl
本篇 
SpEL表达式思考 SpEL表达式思考
SpEL表达式思考概念由常量,变量,运算符构成的一个含有返回值的式子,即为表达式 表达式的概念很简单,那么我们下面看看一些复杂的表达式把 SpEL支持如下表达式: 一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取
  目录