SpEL 的使用

SpEL 的使用

SpEL的全称为 Spring Expression Language,具有再运行时构建复杂表达式、存取对象图属性、对象方法调用等功能

下面是一个简单样例

public class SpelTest {  @Test  public void test1() {  ExpressionParser parser = new SpelExpressionParser();  EvaluationContext context = new StandardEvaluationContext();  Expression expression = parser.parseExpression("'Hello' + ' world' + '!'");  System.out.println(expression.getValue(context));  }
}

输出:

Hello world!

可以看到,再这个例子中,表达式为'Hello' + ' world' + '!',可以看作是'Hello'' world''!'三个字符串的拼接,解析后返回Hello world!

SpEL也支持数字运算:

@Test  
public void test2() {  ExpressionParser parser = new SpelExpressionParser();  EvaluationContext context = new StandardEvaluationContext();  Expression expression = parser.parseExpression("100 + 10");  System.out.println(expression.getValue(context));  expression = parser.parseExpression("100 - 10");  System.out.println(expression.getValue(context));  expression = parser.parseExpression("100 * 10");  System.out.println(expression.getValue(context));  expression = parser.parseExpression("100 / 10");  System.out.println(expression.getValue(context));  expression = parser.parseExpression("100 > 10");  System.out.println(expression.getValue(context));  expression = parser.parseExpression("100 > 10 ? 'A' : 'B'");  System.out.println(expression.getValue(context));  
}

输出:

110
90
1000
10
true
A

此外,SpEL也可以解析方法调用,能够获取调用指定类的指定方法和属性:

@Test  
public void test3() {  UserInfo userInfo = new UserInfo();  userInfo.setUserName("AAA");  ExpressionParser parser = new SpelExpressionParser();  StandardEvaluationContext context = new StandardEvaluationContext(userInfo);  String getUserName = "getUserName";  Expression expression = parser.parseExpression(getUserName);  System.out.println(expression.getValue(context));  
}

输出:

AAA

也可以设置参数:

@Test  
public void test4() {  UserInfo userInfo = new UserInfo();  userInfo.setUserName("BBB");  ExpressionParser parser = new SpelExpressionParser();  String setUserName = "setUserName(#userName)";  StandardEvaluationContext context = new StandardEvaluationContext(userInfo);  context.setVariable("userName", "AAA");  Expression expression = parser.parseExpression(setUserName);  System.out.println(userInfo.getUserName());  
}

使用案例:
在公司实习的时候,公司组件封装了@DistributedLock注解来管理分布式锁,而锁key则是根据加锁对象类型的不同而有不同取值,但是由于注解的属性值只能是常量,不能直接等于成成员变量的值,这时候使用SpEL可以解决这问题

@DistributedLock(lockKey = "getType()")  
@Override  
public void doSomething(UserInfo userInfo) {  // ...
}

在这个例子中,他会在代理解析过程中调用被代理方法的第一个参数的指定方法,即lockKey的值,也就是userInfo.getType()来设置分布式锁的key,这样就能对加锁对象进行动态的调整

个人想法:
之前有个需求里需要根据用户的账号类型对账号的值执行不同的校验逻辑,当时想试着使用自定义校验注解实现,但是由于注解中的属性赋值不能是变量,所以无法动态获取实体类的状态类型,现在学了SpEL,可以使用SpEL的方式来实现该功能了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【性能测试】真实企业,性能测试流程总结分析(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 4、性能测试用例设…

odbc连接mysql数据库

安装odbc相关组件 apt install unixodbc unixodbc-dev libmyodbc 修改odbc配置 执行odbcinst -j查询odbc所读取的配置默认路径,根据查询结果修改,odbc.ini和odbcinst.ini两个文件 odbcinst.ini配置如下 [MySQL] Description MySQL Driver /usr/l…

手把手带你死磕ORBSLAM3源代码(十)System.cc System类代码分析

目录 一.前言 二.代码分析 2.1 引用头文件 2.2 静态成员变量 2.3 System函数 一.前言 这部分代码介绍引用头文件以及System类的函数定义文件。 二.代码分析 2.1 引用头文件 #include "System.h" #include "Converter.h" #include <thread> #…

Azure Machine Learning - Azure OpenAI GPT 3.5 Turbo 微调教程

本教程将引导你在Azure平台完成对 gpt-35-turbo-0613 模型的微调。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&…

Javacv-利用Netty实现推流直播复用(flv)

前言 上一篇文章《JavaCV之rtmp推流&#xff08;FLV和M3U8&#xff09;》介绍了javacv的基本使用&#xff0c;今天来讲讲如何实现推流复用。 以监控摄像头的直播为例&#xff0c;通常分为三步&#xff1a; 从设备获取音视频流利用javacv进行解码&#xff08;例如flv或m3u8&am…

随笔记录.1

1.find高级用法 find . -name *.te | xargs grep -i "zygote_tmpfs" find . -name *.te | xargs grep -i "_app_tmpfs" 2.audit2allow -p policy < avc_log.txt 3.fastboot oem set_selinux na 4.adb disable-verity 5.adb shell am broadcast -a …

初级游戏客户端社招面试问题总结

目录 c c# lua Unity NGUI AssetBundles资源管理 Unity性能优化 图形学 网络 场景题 计组&操作系统 其他知识 算法题 c 虚函数的原理 智能指针的原理 如何解决循环引用 智能指针的源码 c&#xff0c;使用char实现自定义的一个string 可以通过new去申请一…

如何实现准时的setTimeout

背景 setTimeout 是不准的。因为 setTimeout 是一个宏任务&#xff0c;它的指定时间指的是&#xff1a;进入主线程的时间。 setTimeout(callback, 进入主线程的时间)所以什么时候可以执行 callback&#xff0c;需要看 主线程前面还有多少任务待执行。 由此&#xff0c;才有了…

MySQL8安装教程

MySQL安装教程 安装环境 Windows 10 软件下载 1、官网下载 官网可以下载最新版本的MySQL 8.0 下载地址&#xff1a; https://dev.mysql.com/downloads/windows/installer/8.0.html 开始安装 1、下载完成后&#xff0c;我们就开始安装&#xff0c;双击安装包&#xff0c…

李宏毅机器学习2023|图像生成模型

文章目录 图像生成Autoregressive&#xff08;各个击破&#xff09;Non-Autoregressive&#xff08;一次到位&#xff09;一次到位法额外的输入——从一个高维的Normal Distribution作simple得到一个向量常用的图片生成模型VAEFlow-based Generative ModelDiffusion ModelGAN D…

计量校准方案分享No.11——定碳定硫分析仪校准方案

[测量单元:红外碳硫分析仪,是否使用220V交流电源:是,碳测量范围:0.005%-4.3%,硫测量范 围:0.0005%-0.33%] 一 依据文件 CNAS CL01-G002-2021 《测量结果的计量溯源性要求》现行有效 RB/T 034-2020 《测量设备校准周期的确定和调整方法指南》现行有效 CNAS TRL-004-2017 《 …

跨境电商独立站的6大模式,任你选择!

在几年前搭建跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好创建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最…

【Qt-Edit】

Qt编程指南 ■ QTextEdit■ QLineEdit■ QLineEdit 设置正则表达式 ■ QPlainTextEdit■ QKeySequenceEdit■ QList<QLineEdit *> edits■■ ■ QTextEdit /* 实例和对象&#xff0c;设置位置和显示大小 */ textEdit new QTextEdit(this); textEdit->setGeometry(0…

每日一题(LeetCode)----栈和队列-- 简化路径

每日一题(LeetCode)----栈和队列-- 简化路径 1.题目&#xff08;71. 简化路径&#xff09; 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的…

ISO27001认证主要的审核方向

ISO27001审核主要针对组织的信息安全管理体系&#xff08;ISMS&#xff09;进行全面的审查&#xff0c;以确保其符合ISO/IEC 27001标准的要求。审核过程通常包括以下几个方面&#xff1a; 1. 组织环境&#xff1a;审核组织的信息安全管理体系是否能够在组织内部环境以及与外部供…

熟悉DHCP面临的安全威胁与防护机制

一个网络如果要正常地运行&#xff0c;则网络中的主机&#xff08;Host&#xff09;必需要知道某些重要的网络参数&#xff0c;如IP地址、网络掩码、网关地址、DNS服务器地址、网络打印机地址等等。显然&#xff0c;在每台主机上都采用手工方式来配置这些参数是非常困难的、或是…

Springboot学习

Springboot扩展点之InitializingBean-CSDN博客

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

《微信小程序开发从入门到实战》学习六十三

6.4 交互API 使用交互API可以在小程序中显示各种弹窗或动画&#xff0c;达到交互反馈的目的。 6.4.1 提示框API 使用wx.showToast接口可显示消息提示框。接口接受Object参。属性如下&#xff1a; title&#xff08;必填&#xff09; 提示的内容 icon …