正常业务场景一般不用这个技术,但需要知道有这么个东西支持Spring。

记忆力不好,抄了些套路代码便于以后用到。

  1. package com.paic.phssp.springtest.spel;
  2.  
  3. import java.util.Arrays;
  4. import java.util.List;
  5.  
  6. public class Account {
  7. private String name;
  8. private int footballCount;
  9. private Friend friend;
  10. private List<Friend> friends;
  11.  
  12. public Account(String name) {
  13. this.name = name;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setFootballCount(int footballCount) {
  21. this.footballCount = footballCount;
  22. }
  23.  
  24. public void addFriend(Friend friend) {
  25.  
  26. this.friend = friend;
  27. }
  28.  
  29. public int getFootballCount() {
  30. return footballCount;
  31. }
  32.  
  33. public Friend getFriend() {
  34. return friend;
  35. }
  36.  
  37. public void setFriend(Friend friend) {
  38. this.friend = friend;
  39. }
  40.  
  41. public List<Friend> getFriends() {
  42. return friends;
  43. }
  44.  
  45. public void setFriends(List<Friend> friends) {
  46. this.friends = friends;
  47. }
  48.  
  49. public void read(){
  50. System.out.println("读书");
  51. }
  52.  
  53. public void addFriendNames(String ... friendNames){
  54. System.out.println("friendNames="+ Arrays.toString(friendNames));
  55. }
  56. }
  1. package com.paic.phssp.springtest.spel;
  2.  
  3. public class Friend {
  4. private String name;
  5.  
  6. public Friend(String name) {
  7. this.name = name;
  8. }
  9.  
  10. public String getName() {
  11. return name;
  12. }
  13. }
  1. package com.paic.phssp.springtest.spel;
  2.  
  3. import com.paic.phssp.springtest.proxy.cglib.HeroCglibProxyFactory;
  4. import com.paic.phssp.springtest.proxy.cglib.WickedLittleMage;
  5. import com.paic.phssp.springtest.proxy.jdk.HeroProxyFactory;
  6. import com.paic.phssp.springtest.proxy.jdk.IHero;
  7. import com.paic.phssp.springtest.proxy.jdk.MonkeyHero;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.springframework.boot.test.context.SpringBootTest;
  11. import org.springframework.expression.EvaluationContext;
  12. import org.springframework.expression.ExpressionParser;
  13. import org.springframework.expression.spel.standard.SpelExpressionParser;
  14. import org.springframework.expression.spel.support.StandardEvaluationContext;
  15. import org.springframework.test.context.junit4.SpringRunner;
  16.  
  17. import java.util.*;
  18.  
  19. @RunWith(SpringRunner.class)
  20. @SpringBootTest
  21. public class SpelTest {
  22.  
  23. @Test
  24. public void testTextEl() {
  25. //文字表达式
  26. ExpressionParser parser = new SpelExpressionParser();
  27.  
  28. //字符串解析
  29. String str = (String) parser.parseExpression("'你好'").getValue();
  30. System.out.println(str);
  31.  
  32. //整型解析
  33. int intVal = (Integer) parser.parseExpression("0x2F").getValue();
  34. System.out.println(intVal);
  35.  
  36. //双精度浮点型解析
  37. double doubleVal = (Double) parser.parseExpression("4329759E+22").getValue();
  38. System.out.println(doubleVal);
  39.  
  40. //布尔型解析
  41. boolean booleanVal = (boolean) parser.parseExpression("true").getValue();
  42. System.out.println(booleanVal);
  43.  
  44. /* 你好
  45. 47
  46. 4.329759E28
  47. true*/
  48. }
  49.  
  50. @Test
  51. public void testObjEl() {
  52. //初始化对象
  53. Account account = new Account("Deniro");
  54. account.setFootballCount(10);
  55. account.addFriend(new Friend("Jack"));
  56.  
  57. //解析器
  58. ExpressionParser parser = new SpelExpressionParser();
  59. //解析上下文
  60. EvaluationContext context = new StandardEvaluationContext(account);
  61.  
  62. //获取不同类型的属性
  63. String name = (String) parser.parseExpression("name").getValue(context);
  64. System.out.println(name);
  65. int count = (Integer) parser.parseExpression("footballCount+1").getValue(context);
  66. System.out.println(count);
  67.  
  68. //获取嵌套类中的属性
  69. String friend = (String) parser.parseExpression("friend.name").getValue(context);
  70. System.out.println(friend);
  71.  
  72. /*Deniro
  73. 11
  74. Jack*/
  75.  
  76. //安全导航操作符,能够避免空指针异常
  77. account.setFriend(null);
  78. friend = (String) parser.parseExpression("friend?.name").getValue(context,String.class);
  79. System.out.println("friendName:" + friend);//friendName:null
  80.  
  81. }
  82.  
  83. @Test
  84. public void testArrMapListEl() {
  85. //解析器
  86. ExpressionParser parser = new SpelExpressionParser();
  87.  
  88. //解析一维数组
  89. int[] oneArray = (int[]) parser.parseExpression("new int[]{3,4,5}").getValue();
  90. System.out.println("一维数组开始:");
  91. for (int i : oneArray) {
  92. System.out.print(i);
  93. }
  94. System.out.println();
  95. System.out.println("一维数组结束");
  96.  
  97. /* 一维数组开始:
  98. 345
  99. 一维数组结束*/
  100.  
  101. //这里会抛出 SpelParseException
  102. // int[][] twoArray = (int[][]) parser.parseExpression("new int[][]{3,4,5}{3,4,5}")
  103. // .getValue();
  104.  
  105. //解析 list
  106. List list = (List) parser.parseExpression("{3,4,5}").getValue();
  107. System.out.println("list:" + list);
  108. //list:[3, 4, 5]
  109.  
  110. //解析 Map
  111. Map map = (Map) parser.parseExpression("{account:'deniro',footballCount:10}").getValue();
  112. System.out.println("map:" + map);
  113. //map:{account=deniro, footballCount=10}
  114.  
  115. //解析对象中的 list
  116. final Account account = new Account("Deniro");
  117. Friend friend1 = new Friend("Jack");
  118. Friend friend2 = new Friend("Rose");
  119. List<Friend> friends = new ArrayList<>();
  120. friends.add(friend1);
  121. friends.add(friend2);
  122. account.setFriends(friends);
  123.  
  124. EvaluationContext context = new StandardEvaluationContext(account);
  125. String friendName = (String) parser.parseExpression("friends[0].name").getValue(context);
  126. System.out.println("friendName:" + friendName);
  127. //friendName:Jack
  128. }
  129.  
  130. @Test
  131. public void testMethodEl() {
  132. //解析器
  133. ExpressionParser parser = new SpelExpressionParser();
  134.  
  135. //调用 String 方法
  136. boolean isEmpty = parser.parseExpression("'Hi,everybody'.contains('Hi')").getValue(Boolean.class);
  137. System.out.println("isEmpty:" + isEmpty);
  138.  
  139. /**
  140. * 调用对象相关方法
  141. */
  142. final Account account = new Account("Deniro");
  143. EvaluationContext context = new StandardEvaluationContext(account);
  144.  
  145. //调用公开方法
  146. parser.parseExpression("setFootballCount(11)").getValue(context, Account.class);
  147. System.out.println("getFootballCount:" + account.getFootballCount());
  148.  
  149. //调用私有方法,抛出 SpelEvaluationException: EL1004E: Method call: Method write() cannot be found on net.deniro
  150. // .spring4.spel.Account type
  151. // parser.parseExpression("write()").getValue(context,Boolean
  152. // .class);
  153.  
  154. //调用静态方法
  155. parser.parseExpression("read()").getValue(context, Account.class);
  156.  
  157. //调用待可变参数的方法
  158. parser.parseExpression("addFriendNames('Jack','Rose')").getValue(context, Account.class);
  159.  
  160. /* isEmpty:true
  161. getFootballCount:11
  162. 读书
  163. friendNames=[Jack, Rose]*/
  164. }
  165.  
  166. @Test
  167. public void testRelationEl() {
  168. //关系操作符
  169. //解析器
  170. ExpressionParser parser = new SpelExpressionParser();
  171.  
  172. //数值比较
  173. boolean result = parser.parseExpression("2>1").getValue(Boolean.class);
  174. System.out.println("2>1:" + result); //2>1:true
  175.  
  176. //字符串比较
  177. result = parser.parseExpression("'z'>'a'").getValue(Boolean.class);
  178. System.out.println("'z'>'a':" + result); //'z'>'a':true
  179.  
  180. //instanceof 运算符
  181. result = parser.parseExpression("'str' instanceof T(String)").getValue(Boolean.class);
  182. System.out.println("'str' 是否为字符串 :" + result); //'str' 是否为字符串 :true
  183.  
  184. result = parser.parseExpression("1 instanceof T(Integer)").getValue(Boolean.class);
  185. System.out.println("1 是否为整型 :" + result); //1 是否为整型 :true
  186.  
  187. //正则表达式
  188. result = parser.parseExpression("22 matches '\\d{2}'").getValue(Boolean.class);
  189. System.out.println("22 是否为两位数字 :" + result); //22 是否为两位数字 :true
  190. }
  191.  
  192. @Test
  193. public void testlogicEl() {
  194. //解析器
  195. ExpressionParser parser = new SpelExpressionParser();
  196.  
  197. //与操作
  198. boolean result = parser.parseExpression("true && true").getValue(Boolean.class);
  199. System.out.println("与操作:" + result);
  200.  
  201. //或操作
  202. result = parser.parseExpression("true || false").getValue(Boolean.class);
  203. System.out.println("或操作:" + result);
  204.  
  205. parser.parseExpression("true or false").getValue(Boolean.class);
  206. System.out.println("或操作(or 关键字):" + result);
  207.  
  208. //非操作
  209. result = parser.parseExpression("!false").getValue(Boolean.class);
  210. System.out.println("非操作:" + result);
  211. }
  212.  
  213. @Test
  214. public void testOperateEl() {
  215. ExpressionParser parser = new SpelExpressionParser();
  216. //加法运算
  217. Integer iResult = parser.parseExpression("2+3").getValue(Integer.class);
  218. System.out.println("加法运算:" + iResult);
  219.  
  220. String sResult = parser.parseExpression("'Hi,'+'everybody'").getValue(String.class);
  221. System.out.println("字符串拼接运算:" + sResult);
  222.  
  223. //减法运算
  224. iResult = parser.parseExpression("2-3").getValue(Integer.class);
  225. System.out.println("减法运算:" + iResult);
  226.  
  227. //乘法运算
  228. iResult = parser.parseExpression("2*3").getValue(Integer.class);
  229. System.out.println("乘法运算:" + iResult);
  230.  
  231. //除法运算
  232. iResult = parser.parseExpression("4/2").getValue(Integer.class);
  233. System.out.println("除法运算:" + iResult);
  234.  
  235. Double dResult = parser.parseExpression("4/2.5").getValue(Double.class);
  236. System.out.println("除法运算:" + dResult);
  237.  
  238. //求余运算
  239. iResult = parser.parseExpression("5%2").getValue(Integer.class);
  240. System.out.println("求余运算:" + iResult);
  241.  
  242. //三元运算符
  243. boolean result=parser.parseExpression("(1+2) == 3?true:false").getValue(Boolean.class);
  244. System.out.println("result:"+result);
  245. }
  246.  
  247. @Test
  248. public void testClassEl() {
  249. ExpressionParser parser = new SpelExpressionParser();
  250.  
  251. //加载 java.lang.Integer
  252. Class integerClass=parser.parseExpression("T(Integer)").getValue(Class
  253. .class);
  254. System.out.println(integerClass==java.lang.Integer.class);
  255.  
  256. //加载 net.deniro.spring4.spel.Account
  257. Class accountClass=parser.parseExpression("T(com.paic.phssp.springtest.spel.Account)")
  258. .getValue(Class
  259. .class);
  260. System.out.println(accountClass==com.paic.phssp.springtest.spel.Account.class);
  261.  
  262. //调用类静态方法
  263. double result = (double) parser.parseExpression("T(Math).abs(-2.5)").getValue();
  264. System.out.println("result:" + result);
  265.  
  266. //创建对象操作符
  267. Account account=parser.parseExpression("new com.paic.phssp.springtest.spel.Account" +
  268. "('Deniro')").getValue(Account.class);
  269. System.out.println("name:"+account.getName());
  270. }
  271.  
  272. @Test
  273. public void testVariableEl(){
  274. Account account = new Account("Deniro");
  275.  
  276. ExpressionParser parser = new SpelExpressionParser();
  277. EvaluationContext context = new StandardEvaluationContext(account);
  278.  
  279. //定义一个新变量,名为 newVal
  280. context.setVariable("newVal", "Jack");
  281.  
  282. //获取变量 newVal 的值,并赋值给 User 的 name 属性
  283. parser.parseExpression("name=#newVal").getValue(context);
  284. System.out.println("getName:" + account.getName());
  285.  
  286. //this 操作符表示集合中的某个元素
  287. List<Double> scores = new ArrayList<>();
  288. scores.addAll(Arrays.asList(23.1, 82.3, 55.9));
  289. context.setVariable("scores", scores);//在上下文中定义 scores 变量
  290. List<Double> scoresGreat80 = (List<Double>) parser.parseExpression("#scores.?[#this>80]").getValue(context);
  291. System.out.println("scoresGreat80:" + scoresGreat80);
  292. }
  293.  
  294. @Test
  295. public void testCollectSelectEl(){
  296. //集合选择表达式
  297. ExpressionParser parser = new SpelExpressionParser();
  298. List list = (List) parser.parseExpression("{3,4,5}").getValue();
  299.  
  300. //----------------过滤 list 集合中的元素
  301. final StandardEvaluationContext listContext = new StandardEvaluationContext(list);
  302. List<Integer> great4List = (List<Integer>) parser.parseExpression("?[#this>4]").getValue(listContext);
  303. System.out.println("great4List:" + great4List);
  304.  
  305. //获取匹配元素中的第一个值
  306. Integer first = (Integer) parser.parseExpression("^[#this>2]").getValue(listContext);
  307. System.out.println("first:" + first);
  308.  
  309. //获取匹配元素中的最后一个值
  310. Integer end = (Integer) parser.parseExpression("$[#this>2]") .getValue(listContext);
  311. System.out.println("end:" + end);
  312.  
  313. //----------------过滤 Map
  314. Map<String, Double> rank = new HashMap<String, Double>();
  315. rank.put("Deniro", 96.5);
  316. rank.put("Jack", 85.3);
  317. rank.put("Lily", 91.1);
  318.  
  319. EvaluationContext context = new StandardEvaluationContext();
  320. context.setVariable("Rank", rank);
  321. //value 大于 90
  322. Map<String,Double> rankGreat95= (Map<String, Double>) parser.parseExpression("#Rank.?[value>90]").getValue(context);
  323. System.out.println("rankGreat95:" + rankGreat95);
  324.  
  325. //key 按字母顺序,排在 L 后面
  326. Map<String,Double> afterL= (Map<String, Double>) parser.parseExpression("#Rank.?[key>'L']").getValue(context);
  327. System.out.println("afterL:"+afterL);
  328. }
  329. }

参考:

https://www.jianshu.com/p/5537b2c86acd

Spring之Spel表达式的更多相关文章

  1. Spring Security -SpEL表达式

    Spring Security -SpEL表达式 开启SpEL表达式 <!-- use-expressions是否开启 SpEL表达式 o.s.s.web.access.expression.W ...

  2. Spring系列.SpEL表达式

    Spring表达式语言 SpEL语言是一种强大的表达式语言,支持在运行时查询和操作对象.SpEL表达式不一定要创建IOC容器后才能使用.用户完全可以单独调用SpEL的API来独立的使用时SpEL表达式 ...

  3. Spring学习-- SpEL表达式

    Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{...} 作为定界符 , 所有在大括号中的字符都将被认为是 SpE ...

  4. Spring实战学习笔记之SpEL表达式

            在Spring XML配置文件中装配Bean的属性和构造参数都是静态的,而在运行期才知道装配的值,就可以使用SpEL实现         SpEL表达式的首要目标是通过计算获得某个值. ...

  5. Spring SpEL表达式的理解

    Spring的IOC本质就一个容器,也就是一个对象的工厂,我们通过配置文件注册我们的Bean对象,通过他进行对象的组装与床架. SpEL表达式就是一种字符串编程,类似于JS里面的EVAL的作用,通过它 ...

  6. 【spring boot】SpringBoot初学(2.2)– SpEL表达式读取properties属性到Java对象

    前言 github: https://github.com/vergilyn/SpringBootDemo 代码位置:(注意测试方法在,test下的SpelValueApplicationTest.c ...

  7. Spring 缓存注解 SpEL 表达式解析

    缓存注解上 key.condition.unless 等 SpEL 表达式的解析 SpEl 支持的计算变量: 1)#ai.#pi.#命名参数[i 表示参数下标,从 0 开始] 2)#result:Ca ...

  8. SpringBoot SpEL表达式注入漏洞-分析与复现

    目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...

  9. 从头认识Spring-1.14 SpEl表达式(1)-简单介绍与嵌入值

    这一章节我们来讨论一下SpEl表达式的简单介绍与嵌入值. 1.SpEl表达式简单介绍 Spring Excpression Language (SpEL)语言支持在执行时操作和查询对象 事实上就是在执 ...

随机推荐

  1. newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解

    题目描述 筱玛是个快乐的男孩子. 寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险. 迷阵可以看做一个n×nn×n的矩阵A,每个格子上有一个有一个数Ai,j. 入口在左上角的(1,1)处,出口在右下 ...

  2. java 之 音乐播放代码

    //需求:通过代码播放音乐 //1.读取文件 //2.将音乐文件放到播放代码中 //3.播放 public static void main(String[] args) throws Malform ...

  3. wamp phpcms部署网站问题

    服务器使用自己的服务器,域名申请后通过信息服务iis管理器建网站,并将物理地址指定到wamp的www目录中的网站的根目录.这时候如果网站首页已经生成后访问域名将进入网站首页. 出现的问题: 1.导航( ...

  4. 【matlab】笔记_1

    基本操作 ans 最近计算的答案 clc 清除命令行窗口 diary 将命令行窗口文本保存到文件中 矩阵 用逗号 (,) 或空格分隔各行元素. 用分号(;)分隔各列元素. a':装置矩阵. 要执行元素 ...

  5. HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)

    题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...

  6. NOIP2018退役祭

    退役感受 在写下这个标题的时候,我的心情是复杂的,无非就是感觉像对一位将要赶往战场的士兵说:"你的战争已经输掉了." 退役了,没有什么好说的.无论再怎么抱怨这题出的真烂也无法改变了 ...

  7. 利用JavaScriptSOAPClient直接调用webService --完整的前后台配置与调用示例

    JavaScriptSoapClient下载地址:https://archive.codeplex.com/?p=javascriptsoapclient JavaScriptSoapClient的D ...

  8. git Bush应用崩溃If no other git process is currently running, this probably means a git process crashed

    问题: 用git Bush提交的时候遇到一个问题,不论做什么操作都遇到下面的错误信息: fatal: Unable to create 'XXXXXXXXX' : File exists. If no ...

  9. Perl中命令行参数以及打开管道文件

    打开管道文件   Linux提供了管道机制,可以方便应用程序之间的数据传递.在Perl中,扣开和使用管道可采用如下形式的open函数:   open(Filehandle,”丨 CMD”);   其中 ...

  10. 【Django】Django-REST-Framework

    [创建简单的API] 1. cmd.exe >django-admin startproject django_rest>cd django_rest\django_rest>pyt ...