Spring 中如何使用SpEL表达式语言呢?

2023-11-20

转自:

Spring 中如何使用SpEL表达式语言呢?

SpeL简介说明

SpeL:Spring Expression Language是一种功能强大的表达式语言
支持运行时查询和操作对象图,
使用SpeL可采用最少的代码,完成大量的工作

注意事项:
   SpEL本身同Spring没有关联,它可以独立使用
   SpEL是一个表达式语言

SpEL 提供了以下接口和类
Expression interface:该接口负责评估表达式字符串
ExpressionParser interface:该接口负责解析字符串
EvaluationContext interface:该接口负责定义上下文环境
SpEL 支持如下表达式:
1. 基本表达式
字面量表达式、关系、逻辑与算术运算表达式、字符串连接及截取表达式、三目运算表达式、正则表达式、括号优先级表达式
2. 类相关表达式
类类型表达式、类实例化、instanceof 表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean 引用
3. 集合相关表达式
内联 List、内联数组、集合、字典访问、列表、字典、数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义
4. 其他表达式
模板表达式
注意事项:SpEL 表达式中的关键字不区分大小写
例 下面使用 SpEL 输出一个简单的字符串“Hello,我的java265”

package com.java265;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        // 构造解析器
        ExpressionParser parser = new SpelExpressionParser();
        // 解析器解析字符串表达式
        Expression exp = parser.parseExpression("'Hello,我的java265'");
        // 获取表达式的值
        String message = (String) exp.getValue();
        System.out.println(message);
        // OR
        // System.out.println(parser.parseExpression("'Hello,我的java265'").getValue());
    }
}

输出结果---
Hello,我的java265
SpEL表达式 可调用方法、访问属性和调用构造函数
例2
使用 SpEL 调用 concat() 方法

package com.java265;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("'Welcome,我的java265'.concat('!')");
        String message = (String) exp.getValue();
        System.out.println(message);
    }
}

输出结果----
Welcome,我的java265!
例 3
使用 SpEL 调用 String 的属性 bytes,将字符串转换为字节数组

package com.java265;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("'Hello 我的java265'.bytes");
        byte[] bytes = (byte[]) exp.getValue();
        for (int i = 0; i < bytes.length; i++) {
            System.out.print(bytes[i] + " ");
        }
    }
}

输出结果---
72 101 108 108 111 32 -79 -32 -77 -52 -80 -17
例 4
SpEL 还支持使用嵌套属性,下面将字符串转换为字节后获取长度

package com.java265;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("'Hello 我的java265'.bytes.length");
        int length = (Integer) exp.getValue();
        System.out.println(length);
    }
}

输出结果
15


例 5
字符串的构造函数可以被调用,而不是使用字符串文本,下面将字符串内容转换为大写字母

package com.java265;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("new String('hello java265').toUpperCase()");
        String message = exp.getValue(String.class);
        System.out.println(message); 
    }
}

输出结果---
HELLO JAVA265
SpEL对Bean定义的支持
SpEL 表达式可以与 XML 或基于注解的配置元数据一起使用,SpEL 表达式以#{开头,以}结尾,如#{'Hello'}

基于XML的配置

可以使用以下表达式来设置属性或构造函数的参数值

<bean id="number" class="com.java265.Number"<
    <property name="randomNumber" value="#{T(java.lang.Math).random() * 100.0}" /<
</bean<
也可以通过名称引用其它 Bean 属性,如以下代码。
<bean id="shapeGuess" class="com.java265.ShapeGuess" <
    <property name="shapSeed" value="#{number.randomNumber}"/<
</bean<

使用注解的配置

@Value 注解可以放在字段、方法、以及构造函数参数上,以指定默认值。 以下是一个设置字段变量默认值

public static class FieldValueTestBean
    @value("#{ systemProperties[ 'user.region'] }")
    private String defaultLocale;
    public void setDefaultLocale (String defaultLocale) {
        this.defaultLocale = defaultLocale;
    }
    public string getDefaultLocale() {
        return this.defaultLocale;
    }
}

SpEL中的运算符
我们可以在 SpEL 中使用运算符,例如算术运算符、关系运算符、逻辑运算符
例 6

package com.java265;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        // 算术运算符
        System.out.println(parser.parseExpression("'Hello SPEL'+'!'").getValue());
        System.out.println(parser.parseExpression("8 * 8/4").getValue());
        System.out.println(parser.parseExpression("'今天是:'+ new java.util.Date()").getValue());
        // 逻辑运算符
        System.out.println(parser.parseExpression("true and true").getValue());
        // 关系运算符
        System.out.println(parser.parseExpression("'sonoo'.length()==5").getValue());
    }
}

输出结果---
Hello SPEL! 14 今天是:Fri Feb 08 09:09:30 CST 2021
true true SpEL中的变量 在 SpEL 中,我们可以定义变量,并在方法中使用。定义变量需要用到 StandardEvaluationContext 类。 例 7 Calculation 类代码

package com.java265;
public class Calculation {
    private int number;
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public int cube() {
        return number * number * number;
    }
}

Test 类

package com.java265;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class Test {
    public static void main(String[] args) {
        Calculation calculation = new Calculation();
        StandardEvaluationContext context = new StandardEvaluationContext(calculation);
        ExpressionParser parser = new SpelExpressionParser();
        parser.parseExpression("number").setValue(context, "5");
        System.out.println(calculation.cube());
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 中如何使用SpEL表达式语言呢? 的相关文章

随机推荐

  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • 软件测试之第九章 搭建Web服务器

    第九章 搭建 Web 服务器 一 Web 简介 1 网页 通过浏览器打开的任意一个页面 窗口 本质上是服务器中的一个文件 是使用如 html asp aspx php jsp cgi 等语言编写的代码文件 扩展名有 htm html sht
  • The OpenWire Wire Format

    The OpenWire Wire Format 字面意思是 开放连接是默认连接 传输 格式 开放连接是activemq的默认连接格式 它提供一种高效率的二进制格式来使消息高速传输 开放连接能够被JMS的客户端配置为连接URL字符串 或者一
  • GSM模块_GPRS数据传输机制和原理

    通信专业术语 BSS 基站子系统 通过无线接口与移动台直接联系 负责在一定区域内和移动台通信 GSM BTS 基站收发台 可以看作一复杂的无线调制器 BSS的主要部分 每个分配有若干信道 GSM RBS Radio Base Station
  • Webpack插件核心原理

    引言 围绕 Webpack 打包流程中最核心的机制就是所谓的 Plugin 机制 所谓插件即是 webpack 生态中最关键的部分 它为社区用户提供了一种强有力的方式来直接触及 webpack 的编译过程 compilation proce
  • knime简介_KNIME简介

    knime简介 Data Science is abounding It considers different realms of the data world including its preparation cleaning mod
  • ubuntu本地安装jdk17

    下载 wget https download oracle com java 17 archive jdk 17 0 7 linux x64 bin tar gz 解压 tar zxvf jdk 17 0 7 linux x64 bin t
  • 【c++】Lambda表达式

    Lambda表达式 Lambda表达式是C 中的匿名函数 允许你在需要时定义和使用小型函数 语法 Lambda表达式的基本语法如下 scssCopy code 捕获列表 参数列表 gt 返回类型 Lambda函数体 捕获列表定义了Lambd
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • vue列表跳转详情,记录列表滚动不变

    记录主元素 computed elTable function return document getElementsByClassName layout content 0 当引入keep alive的时候 页面第一次进入 钩子的触发顺序
  • 回溯法展开状态空间树

    解空间 假设问题的解能用n元组 X1 Xn 表示 其中Xi取自某个有穷集Si 这些n元组构成的集合称为问题的解空间 假设集合Si的大小 Si mi 则解空间的大小m m1 m2 mn 注意这里解空间的大小取决于元组中每个元素的可能取值的数量
  • STM32内部参照电压VREFIN的使用

    一 STM32的内部参照电压VREFINT和ADCx IN17相连接 它的作用是相当于一个标准电压测量点 和MSP430不一样 内部参照电压VREFINT只能出现在主ADC1中使用 内部参照电压VREFINT与参考电压不是一回事 ADC的参
  • 详解git pull和git fetch的区别:

    前言 在我们使用git的时候用的更新代码是git fetch git pull这两条指令 但是有没有小伙伴去思考过这两者的区别呢 有经验的人总是说最好用git fetch git merge 不建议用git pull 也有人说git pul
  • @Slf4j 实现日志输入到外部文件

    1 添加一个配置文件 src main resources logback spring xml
  • 使用html+css+javaScript 完成计算器

    一 先用html与css搭建骨架 思路 将计算器的数字按钮放进一个表格里 再通过css修饰 然后对指定的数字按钮或功能按钮添加事件 将需要计算的式子放进一个字符串里 最后通过全局方法eval 计算出来 html的骨架搭建 这里的用一个 di
  • 西门子300系列基本逻辑编程:手自动选择程序及自定义脉冲模块的使用

    西门子内置脉冲发生器 M0 0 0 1S M0 1 0 2S M0 2 0 4S M0 3 0 5S M0 4 0 8S M0 5 1 0S M0 6 1 6S M0 7 2 0S 案例 手自动选择程序 控制要求 I0 0是手自动选择开关
  • Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法

    Vmware正确安装完linux虚拟机之后 这里以Ubuntu为例 其他linux或windows系统也是类似的 如果你使用的默认配置 正常情况下就可以复制 粘贴和拖拽内容的 双方向都是支持的 如果不能复制和拖拽一般是vmware tool
  • mongodb入门(2)

    目录 一 mongodb入门 1基础概念 2连接mongodb 3 数据库 4 集合 5 文档 1 插入文档 2 更新文档 3删除文档 4查询文档 6用户 1 创建用户 2查询用户 3删除用户 4修改用户 5修改密码 一 mongodb入门
  • 10 个牛逼的单行代码编程技巧,你会用吗?

    标题本文列举了十个使用一行代码即可独立完成 不依赖其他代码 的业务逻辑 主要依赖的是Java8中的Lambda和Stream等新特性以及try with resources JAXB等 1 对列表 数组中的每个元素都乘以2 Range是半开
  • Spring 中如何使用SpEL表达式语言呢?

    转自 Spring 中如何使用SpEL表达式语言呢 SpeL简介说明 SpeL Spring Expression Language是一种功能强大的表达式语言 支持运行时查询和操作对象图 使用SpeL可采用最少的代码 完成大量的工作 注意事