el表达式笔记及ognl

文章目录

    • spel底层
      • spel核心代码
        • TokenKind源码
      • spel本地调试
    • spel示例
        • spel list例子
        • spel 对象例子
        • spel list例子
        • SimpleEvaluationContext 类找不到
          • ##### spel 如何表示包含(也就是like)?
        • spel官网文档
      • ognl表达式
      • ognl和表达式语言的区别

这里重点说下SPEL(Spring Expression Language)。

spel底层

还是那句话,没有谁想要研究底层,除非他遇到问题解不了。
个人就是这种情况,如:spel模糊匹配怎么弄?
文档中的例子不一定全,简单说就是比较概括,但是底层代码却是最完整的。

什么?看代码太麻烦。恰恰相反,最复杂的就是最简单的,看了看代码,反而对spel的了解深入了些。

spel核心代码

核心代码在这里(表达式非模板,模板有另外的解析):
org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression()

它的机制比较清楚。简单说就是根据符号,进行解析

TokenKind源码

这个枚举类很关键,所有的表达式符号都在这里,所以不用去查是否支持了,看这个类就一目了然。

照搬源码:

enum TokenKind {

	// ordered by priority - operands first

	LITERAL_INT,

	LITERAL_LONG,

	LITERAL_HEXINT,

	LITERAL_HEXLONG,

	LITERAL_STRING,

	LITERAL_REAL,

	LITERAL_REAL_FLOAT,

	LPAREN("("),

	RPAREN(")"),

	COMMA(","),

	IDENTIFIER,

	COLON(":"),

	HASH("#"),

	RSQUARE("]"),

	LSQUARE("["),

	LCURLY("{"),

	RCURLY("}"),

	DOT("."),

	PLUS("+"),

	STAR("*"),

	MINUS("-"),

	SELECT_FIRST("^["),

	SELECT_LAST("$["),

	QMARK("?"),

	PROJECT("!["),

	DIV("/"),

	GE(">="),

	GT(">"),

	LE("<="),

	LT("<"),

	EQ("=="),

	NE("!="),

	MOD("%"),

	NOT("!"),

	ASSIGN("="),

	INSTANCEOF("instanceof"),

	MATCHES("matches"),

	BETWEEN("between"),

	SELECT("?["),

	POWER("^"),

	ELVIS("?:"),

	SAFE_NAVI("?."),

	BEAN_REF("@"),

	FACTORY_BEAN_REF("&"),

	SYMBOLIC_OR("||"),

	SYMBOLIC_AND("&&"),

	INC("++"),

	DEC("--");


	final char[] tokenChars;

	final private boolean hasPayload;  // is there more to this token than simply the kind


	private TokenKind(String tokenString) {
		this.tokenChars = tokenString.toCharArray();
		this.hasPayload = (this.tokenChars.length == 0);
	}

	private TokenKind() {
		this("");
	}


	@Override
	public String toString() {
		return (name() + (this.tokenChars.length !=0 ? "(" + new String(this.tokenChars) +")" : ""));
	}

	public boolean hasPayload() {
		return this.hasPayload;
	}

	public int getLength() {
		return this.tokenChars.length;
	}

}

spel本地调试

通过属性注入的方式也不慢,但是还有更简单的方式,就是本地直接调试,如在main方法里面。

不只一种方式可以配置环境变量,如:
1、StandardEvaluationContext

StandardEvaluationContext context = new StandardEvaluationContext();

2、EvaluationContext context(需要spring 4.3.15.RELEASE及以上)

EvaluationContext context = StandardEvaluationContext.forReadOnlyDataBinding().build();

后续示例,context哪个都可能啊。

spel示例

spel list例子
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("primes",primes);
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression("#primes.?[#this>10]").getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));
spel 对象例子
 String usernmae =
(String) parser.parseExpression("#user.userName").getValue(context);
System.out.println(usernmae);
spel list例子

List primes = new ArrayList();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable(“primes”,primes);
List primesGreaterThanTen = (List) parser.parseExpression(“#primes.?[#this>10]”).getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));

SimpleEvaluationContext 类找不到

SimpleEvaluationContext was added in 4.3.15.RELEASE so the fact you can’t find it in 4.3.14.RELEASE is perfectly normal.
Spring Boot 1.5.13 uses Spring Framework 4.3.17.RELEASE.
由此可见,由于SimpleEvaluationContext 是4.3.15.RELEASE才增加的,只要把依赖的版本大于这个版本就行了。但由于官方推荐springBoot 1.5.13应该使用spring的4.3.17.RELEASE版本,那就把spring版本升级。

简单说,就是SimpleEvaluationContext是4.3.15.RELEASE及以上版本才支持的。
升级下maven即可。

注:spring版本和release版本不是一回事。

##### spel 如何表示包含(也就是like)?

待办

spel官网文档

这里用5.3.18版本的吧,如下连接直接定位到spel。

https://docs.spring.io/spring-framework/docs/5.3.18/reference/html/core.html#expressions

ognl表达式

ognl表达式我们一定不陌生,可能会说没听说过,实际我们一直在用。
举个最简单的例子,spring的配置文件,其实就是ognl表达式。

spring.application.name=crm
server.port=8080

为什么要整理下呢?是因为遇到个问题,需要模糊匹配个值,居然不知道如何写,难道真的啥也不会了?

ognl和表达式语言的区别

ognl最早出现在structs,需要和structs一起使用。
表达式语言则是个比较广泛的概念,其中最出名的就是spring的(是spring的吗?)el表达式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

更改Anki笔记所应用的模板及其所属的牌组

对于Anki中的笔记&#xff0c;录入时总会为它指定模板以及所属的牌组&#xff0c;但是&#xff0c;如果发生教材版本变更&#xff0c;我们可能会用新的模板添加笔记&#xff0c;也会使用新的牌组&#xff0c;但是原来所做的笔记中也有一些完全可以继续使用&#xff0c;如果可以…

超详细的 C++中的封装继承和多态的知识总结<1.封装与继承>

引言 小伙伴们都知道C面向对象难&#xff0c;可是大家都知道&#xff0c;这个才是C和C的真正区别的地方&#xff0c;也是C深受所有大厂喜爱的原因&#xff0c;它的原理更接近底层&#xff0c;它的逻辑更好&#xff0c;但是学习难度高&#xff0c;大家一定要坚持下来呀&#xff…

【实验室精选】PFA反应瓶带鼓泡球 高效气体鼓泡 化学分析优选

PFA反应瓶带鼓泡球是一种特殊设计的实验室容器&#xff0c;它集成了鼓泡球和PFA&#xff08;全氟烷氧基&#xff09;材料的反应瓶&#xff0c;用于气体的鼓泡和液体的混合。以下是它的一些特点和用途&#xff1a; 特点&#xff1a; 鼓泡球设计&#xff1a;鼓泡球周围布满小孔&…

Unity热更方案HybridCLR+YooAsset,纯c#开发热更,保姆级教程,从零开始

文章目录&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

60种AI工具用法 学会探索AI的无限可能

外面还在卖的课程&#xff0c;学会探索AI的无限可能&#xff0c;从构建精准的提示词到获取个性化新闻&#xff0c;从快速制作PPT到短视频内容的智能提炼&#xff0c;再到编程、股市分析和视频剪辑&#xff0c;AI工具助您工作学习效率飞跃提升&#xff01; 百度网盘 请输入提取…

Linux多进程和多线程(五)进程间通信-消息队列

多进程(五) 进程间通信 消息队列 ftok()函数创建消息队列 创建消息队列示例 msgctl 函数示例:在上⼀个示例的基础上&#xff0c;加上删除队列的代码 发送消息 示例: 接收消息示例 多进程(五) 进程间通信 消息队列 消息队列是一种进程间通信机制&#xff0c;它允许两个或多个…

单例模式详解:概念与实用技巧

目录 单例模式单例模式结构单例模式适用场景单例模式优缺点练手题目题目描述输入描述输出描述输入示例输出示例提示信息题解 单例模式 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 只有一个实例的…

【深入理解Java虚拟机】判断垃圾-引用计数法及其缺陷

什么是引用计数法 引用计数法用来判断对象是否存活 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器的值加一&#xff1b;当引用失效时&#xff0c;计数器的值就减一&#xff0c;任何时刻计数器为0的对象是不可能在被使用的。&#xff08;存…

c++类模板及应用

文章目录 为什么要有函数模板一般实现举例类模板举例 继承中类模板的使用特殊情况 友元函数模板类和静态成员类模板实践 为什么要有函数模板 项目需求: 实现多个函数用来返回两个数的最大值&#xff0c;要求能支持char类型、int类型、double 一般实现举例 类模板举例 继承中类…

2.2 ROS2话题通信

场景 话题通信是ROS中使用频率最高的一种通信模式&#xff0c;话题通信是基于发布订阅模式的&#xff0c;也即&#xff1a;一个节点发布消息&#xff0c;另一个节点订阅该消息。话题通信的应用场景也极其广泛&#xff0c;比如如下场景&#xff1a; 机器人在执行导航功能&#…

肺炎-X光-图像分类数据集

肺炎-X光-图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bt6tf-jHqgufKqPmCFHbrQ?pwdaj54 提取码&#xff1a;aj54 数据集信息介绍&#xff1a; 文件夹 健康 中的图片数量: 1575 文件夹 新冠肺炎 中的图片数量: 1728 文件夹 普通肺炎 中的…

AI:开发者的超级助手,而非取代者

AI&#xff1a;开发者的超级助手&#xff0c;而非取代者 引言 在这个日新月异的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已悄然渗透到我们生活的方方面面&#xff0c;尤其是在软件开发领域&#xff0c;它正以一种前所未有的方式改变着我们的工作方式。作为一名…

Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

Redis 中的通用命令(高频率操作) 文章目录 Redis 中的通用命令(高频率操作)Redis 的数据类型redis-cli 命令Keys 命令Exists 命令Expire 命令Ttl 命令Type命令 Redis 的数据类型 Redis 支持多种数据类型&#xff0c;整体来说&#xff0c;Redis 是一个键值对结构的&#xff0c;…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

【软件测试】之自动化测试

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 什么是自动化测试Selenium介绍什么是SeleniumSelenium的特点工作原理 SeleniumJava环境搭建下载…

数学建模------Matlab数据可视化

目录 1.plot函数 &#xff08;1&#xff09;函数介绍 &#xff08;2&#xff09;参数介绍 &#xff08;3&#xff09;图形美化 &#xff08;4&#xff09;背景更改 &#xff08;5&#xff09;多组绘制 &#xff08;6&#xff09;图形叠加 &#xff08;7&#xff09;添加…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 英文单词联想(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…

Flume集群部署(手把手部署图文详细版)

前景概要&#xff1a; Kafka消息订阅系统在大数据业务中有着重要运用&#xff0c;尤其在实时业务中&#xff0c;kafka是必不可少的组件之一。 Flume是大数据组件中重要的数据采集工具&#xff0c;我们常利用Flume采集各种数据源的数据供其他组件分析使用。例如在实时业务中&…

大白菜U盘启动工具

大白菜如何u盘启动进winpe装系统大白菜是一款非常实用的U盘启动盘制作工具&#xff0c;可以帮助用户快速地将U盘制作成启动盘&#xff0c;从而方便地进行系统安装、维护和修复等操作。官方网站&#xff1a; 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页…