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的方式来实现该功能了
相关文章:
SpEL 的使用
SpEL 的使用 SpEL的全称为 Spring Expression Language,具有再运行时构建复杂表达式、存取对象图属性、对象方法调用等功能 下面是一个简单样例 public class SpelTest { Test public void test1() { ExpressionParser parser new SpelExpressionParser(); …...
数据采集实战:电商详情页数据埋点
本文我们以电商产品的商品详情页为例,介绍如何做用户浏览以及点击行为的数据埋点。 案例中包含一个页面(商品详情页)以及该页面上的关键按钮(加购、收藏按钮),具体页面如下图所示。 (1…...
计算机网络——计算大题(七)
前言: 最近也是在准备计算机考试,我们的考试形式是上机考试,所以可能有些计算题是会给提供思路的,前面已经对本学期的计算机网络知识有了一个简单的认识与了解,现在我们就来对计算大题进行一个学习吧,这里的…...
子网掩码与IP段计算
一.什么叫子网掩码: 子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩…...
【译文】IEEE白皮书 6G 太赫兹技术的基本原理 2023版
第一章 简介 太赫兹波是介于微波和光波之间的光谱区域,频率从 0.1THz ~ 10THz 之间,波长在 3mm ~ 30μm 之间。提供大块连续的频带范围以满足对 Tbit/s 内极高数据传输速率的需求,使该区域成为下一代无线通信(6G)的重…...
AUTOSAR从入门到精通-网络通信(UDPNm)(三)
目录 前言 原理 网络状态 初始化 执行 处理器架构 时间参数...
ubuntu 使用openssl制作一个自签名证书
我们需要为浏览器创建自己的根CA证书来信任自签名证书。因此,让我们首先创建根CA证书 创建根CA证书 创建文件夹 mkdir openssl && cd openssl执行以下openssl命令,生成 rootCA.key 以及 rootCA.crt. 用你的域名或者ip地址替换demo.mlopshub.c…...
WPF+Halcon 培训项目实战(1-5):Halcon安装,图像处理,Halcon简单模板匹配
文章目录 前言相关链接项目专栏我个人对就业市场的评价Halcon安装实战1-4:Halcon基础实战5:模板匹配[形状匹配]实战代码 结尾 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主…...
虚函数的讲解
文章目录 虚函数的声明与定义代码演示基类Person派生类Man派生类Woman 测试代码动态绑定静态绑定访问私有虚函数总结一下通过成员函数指针调用函数的方式 虚函数的声明与定义 虚函数存在于C的类、结构体等中,不能存在于全局函数中,只能作为成员函数存在…...
Java强软弱虚引用
面试: 1.强引用,软引用,弱引用,虚引用分别是什么? 2.软引用和弱引用适用的场景? 3.你知道弱引用的话,能谈谈WeakHashMap吗? 目录 一、Java引用 1、强引用(默认支持模式…...
QCharView使用
QCharView概念:title、系列、图标Chart、视图 说明: 需要添加Qt组件charts 在使用QChart或者QChartView之前需要添加宏定义QT_CHARTS_USE_NAMESPACE (其实是使用了命名空间),不然不能识别QChart或者QChartView 3.在添加宏定义QT_CHARTS_USE_N…...
华为hcia之ipv6实验手册
R3: dhcp enable ipv6 dhcpv6 pool test address prefix 2000:23::/64 excluded-address 2000:23::2 dns-server 2000:23::2 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000:12::2/64 ipv6 address auto link-local undo ipv6 nd ra halt //无状态配置 inter…...
算法设计与分析-图算法小结BFS/DFS/Topologic/Dijkstra/Floyd/最大流
图 注:CSDN貌似不支持较长公式,可以复制到Markdown编辑器查看 图的表示 邻接矩阵 空间复杂度 Θ ( V 2 ) Θ(V^2) Θ(V2)邻接链表 空间复杂度 Θ ( V E ) Θ(VE) Θ(VE) BFS 邻接链表 时间复杂度 Θ ( V E ) Θ(VE) Θ(VE) void BFS(Graph G, int v) {//…...
CentOS 8 安装指定版本ansible
背景:想要练习ansible使用,用于面试,结果使用centos 8 的yum安装失败,提示版本不兼容(指的是python版本),故而使用python来安装指定版本的ansible,特此记录 环境:win11虚…...
策略模式(及案例)
策略模式 1.策略接口 定义一组算法或操作的通用接口,通常是一个抽象类或接口。该接口声明了策略类所必须实现的方法。 示例: class Strategy {doOperation() {} }2.具体策略 实现策略接口,提供具体的算法实现。每个具体策略类负责处理一…...
苹果CMS超级播放器专业版无授权全开源,附带安装教程
源码介绍 超级播放器专业版v1.0.8,内置六大主流播放器,支持各种格式的视频播放,支持主要功能在每一个播放器内核中都相同效果。 搭建教程 1.不兼容IE浏览器 2.php版本推荐7.4 支持7.1~7.4 3.框架引入不支持同时引入多个播放器 json对接教…...
项目记录:利用Redis实现缓存以提升查询效率
一、概述 当我们查询所有数据时,如果缓存中没有,则去数据库查询,如果有,直接查缓存的数据就行。注意定期更新缓存数据。 二、主体代码 private static final String ROOM_SCHEDULES_HASH "RoomSchedules";Overridepu…...
腾讯云16核32G28M轻量服务器CPU流量性能测评
腾讯云轻量16核32G28M服务器28M公网带宽下载速度峰值可达3584KB/s,折合3.5M/秒,系统盘为380GB SSD盘,6000GB月流量,折合每天200GB流量。腾讯云百科txybk.com来详细说下腾讯云轻量应用服务器16核32G28M配置性能、CPU主频型号、公网…...
【并发设计模式】聊聊等待唤醒机制的规范实现
在多线程编程中,其实就是分工、协作、互斥。在很多场景中,比如A执行的过程中需要同步等待另外一个线程处理的结果,这种方式下,就是一种等待唤醒的机制。本篇我们来讲述等待唤醒机制的三种实现,以及对应的应用场景。 G…...
CentOS:docker同一容器间通信
docker同一容器中不同服务以别名访问 1、创建bridge网络 docker network create testnet 2、查看Docker网络 docker network ls 3、运行容器连接到testnet网络 使用方法:docker run -it --name <容器名> —network --network-alias <网络别名> <…...
Harness Engineering: 为 AI 搭建可持续迭代环境的实践
在公司内部一个 AIGC页面 Verify 项目(下面代号 HelixVerify )中,我们经历了 114 次版本迭代, 将相对benchmark 的风险样本召回率从 最初的 8% 提升至 98.86%,无风险样本通过率从 36.11% 提升至 54.93%。 **整个 114 次迭代中,基本没有代码是我手写的。**从第一个版本开始,所有…...
小说作者必备:次元画室快速构建角色设定,灵感秒变草图
小说作者必备:次元画室快速构建角色设定,灵感秒变草图 你是否经常遇到这样的困境:脑海中浮现出一个鲜活的角色形象,却苦于无法用文字准确描述?或者写好了人物设定,却找不到合适的画师将其可视化࿱…...
百川2-13B量化版性能实测:OpenClaw长任务下的Token消耗与稳定性
百川2-13B量化版性能实测:OpenClaw长任务下的Token消耗与稳定性 1. 测试背景与动机 上周在尝试用OpenClaw自动化处理一个包含2000多份PDF的文献库时,遇到了令人头疼的Token消耗问题。原本计划让AI助手完成"读取PDF标题-提取关键词-分类归档"…...
sysstat多语言支持:国际化部署的完整指南
sysstat多语言支持:国际化部署的完整指南 【免费下载链接】sysstat Performance monitoring tools for Linux 项目地址: https://gitcode.com/gh_mirrors/sy/sysstat sysstat是一款功能强大的Linux性能监控工具,支持多语言界面,能够帮…...
Java突变测试终极指南:Pitest如何提升你的代码质量
Java突变测试终极指南:Pitest如何提升你的代码质量 【免费下载链接】pitest State of the art mutation testing system for the JVM 项目地址: https://gitcode.com/gh_mirrors/pi/pitest 突变测试是Java开发中革命性的质量保障技术,而Pitest&am…...
保姆级教程:用唯创知音WT588F02B语音芯片,从录音到烧录完整走一遍
零基础实战:WT588F02B语音芯片从录音到播放全流程解析 第一次接触语音芯片开发时,我被WT588F02B的易用性惊艳到了——不需要复杂的编程,只需准备好音频文件就能实现语音播放功能。但实际操作中,从录音到最终烧录成功,每…...
CasRel关系抽取实战:对接Airflow构建SPO抽取ETL调度流水线
CasRel关系抽取实战:对接Airflow构建SPO抽取ETL调度流水线 1. 项目背景与价值 在日常业务中,我们经常需要从大量文本数据中提取结构化信息。比如从新闻文章中提取人物关系,从产品描述中提取规格参数,从客服对话中提取用户诉求等…...
终极Python量化分析指南:5个技巧快速掌握通达信数据接口
终极Python量化分析指南:5个技巧快速掌握通达信数据接口 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx MOOTDX是一个基于Python的通达信数据接口实现,为量化分析开发者和股…...
告别80类限制!用YOLO-World+CLIP实现‘指哪打哪’的任意物体检测(保姆级教程)
突破类别限制:YOLO-World与CLIP联动的开放词汇检测实战 想象一下,当你需要检测一张照片中"左手边的马克杯"或"书架第三层的编程书籍"时,传统物体检测模型会告诉你:"抱歉,这不在我的80类识别范…...
Realistic Vision V5.1 虚拟摄影棚:QT开发跨平台AI图像生成桌面应用
Realistic Vision V5.1 虚拟摄影棚:QT开发跨平台AI图像生成桌面应用 想象一下,你是一位独立摄影师或内容创作者,脑海里有一个绝妙的画面构思——可能是晨曦中穿着复古长裙的少女,也可能是赛博朋克都市里的未来侦探。过去…...
