SpEl 实例

  • 基于 Spring 解析
@RestController
@RequestMapping("/spel")
@Slf4j
public class SpELController implements ApplicationRunner {
/**
* 1)字面值
*/
@Value("#{ 'zxd' }")
private String name;
@Value("#{ 29 }")
private int age;
@Value("#{ true }")
private boolean male;
@Value("#{ 15505883728L }")
private long phone; /**
* org.springframework.beans.factory.config.BeanExpressionContext
* 2)对象属性
*/
@Value("#{ beanFactory.beanDefinitionNames }")
private List<String> beanDefinitionNames; /**
* 3)实例方法调用
*/
@Value("#{ 'zxd'.length() }")
private int length; /**
* 4)关系操作符
*/
@Value("#{ 2>=1 }")
private boolean operator;
@Value("#{ true or false}")
private boolean or;
@Value("#{ true and false}")
private boolean and;
@Value("#{ !true }")
private boolean not;
@Value("#{ (1+2)*3/4-5 }")
private int plus;
@Value("#{ 7%3 }")
private int mod; /**
* 5)静态属性
*/
@Value("#{ T(java.lang.Math).PI }")
private double pi; /**
* 6)构造函数
*/
@Value("#{ new org.zxd.spring5.springmvc.controller.User('zxd',29)}")
private User user; /**
* 7)静态方法调用
*/
@Value("#{ T(org.zxd.spring5.springmvc.controller.User).of('prince',28) }")
private User staticUser; /**
* 8)#root 永远表示根对象
*/
@Value("#{ #root }")
private BeanExpressionContext beanExpressionContext; /**
* 9)#this 永远表示当前评估的对象
*/
@Value("#{ {1,3,5,7}.?[#this>2] }")
private List<Integer> gt2; /**
* 10)使用 beanResolver 读取名称为 spELController 的 bean
* 使用 @ 读取实例 bean,使用 & 读取工厂 bean
*/
@Value("#{ @jacksonObjectMapper }")
private ObjectMapper objectMapper; /**
* 11)三元操作符
*/
@Value("#{ true?'trueExpr':'falseExpr' }")
private String expr; /**
* 12)埃维尔斯操作符
*/
@Value("#{ null?:'defaultValue' }")
private String unkonwn; /**
* 13)安全导航操作符
*/
@Value("#{ null?.field }")
private String safeNull; /**
* 14)集合选择
* .?[] 从集合中筛选元素,返回一个新的集合
* .^[] 获取第一个匹配的元素
* .$[] 获取最后一个匹配的元素
*/
@Value("#{ {'java','maven','hello'}.^[#this.length()==5] }")
private String firstMatch;
@Value("#{ {'java','maven','hello'}.$[#this.length()==5] }")
private String lastMatch; /**
* 15)集合投影
*/
@Value("#{ {'java','maven','hello'}.![#this.length()] }")
private List<Integer> projection; /**
* 16)表达式模板
*/
@Value("random number is #{ T(java.lang.Math).random() }")
private String template; @GetMapping("/validate")
public void validate() {
assertEquals("zxd", name);
assertEquals(29, age);
assertTrue(male);
assertEquals(15505883728L, phone);
assertNotNull(beanDefinitionNames);
assertEquals(3, length);
assertTrue(operator);
assertTrue(or);
assertFalse(and);
assertFalse(not);
assertEquals(-3, plus);
assertEquals(1, mod);
assertEquals(Math.PI, pi, 0);
assertEquals("zxd", user.getName());
assertEquals(29, user.getAge());
assertEquals("prince", staticUser.getName());
assertEquals(28, staticUser.getAge());
assertNotNull(beanExpressionContext);
assertTrue(CollectionUtils.isEqualCollection(Lists.newArrayList(3, 5, 7), gt2));
assertNotNull(objectMapper);
assertEquals("trueExpr", expr);
assertEquals("defaultValue", unkonwn);
assertNull(safeNull);
assertEquals("maven", firstMatch);
assertEquals("hello", lastMatch);
assertTrue(CollectionUtils.isEqualCollection(Lists.newArrayList(4, 5, 5), projection));
} /**
* 查看容器中注册的所有 bean及其类型
*/
@Autowired
private AnnotationConfigServletWebServerApplicationContext applicationContext;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("applicationContext {}", applicationContext.getClass());
Stream.of(applicationContext.getBeanDefinitionNames()).forEach(name -> {
log.info("{}==={}", name, applicationContext.getBean(name).getClass());
});
}
}
  • 自定义解析
public class SpelEvaluate {

    @Test
public void evaluate() {
// SpelExpressionParser 是线程安全的,可复用
final SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
final String expressionString = "#{name}";
final ParserContext context = ParserContext.TEMPLATE_EXPRESSION;
final Expression rootExpress = spelExpressionParser.parseExpression(expressionString, context); final User user = User.of("zxd", 29);
final StandardEvaluationContext evaluationContext = new StandardEvaluationContext(user);
// 基于 evaluationContext 的 root 执行计算
final String name = rootExpress.getValue(evaluationContext, String.class);
// 基于自定义 root 执行计算
final String fromRoot = rootExpress.getValue(user, String.class);
assertEquals(name, fromRoot); /**
* 直接以 # 开头的表达式表示从变量映射中读取,而不是从根开始解析
* #root 表示根对象,#this 表示当前解析对象【适用于集合操作】
*/
final Expression rootName = spelExpressionParser.parseExpression("#root.name");
final String root = rootName.getValue(evaluationContext, String.class); evaluationContext.setVariable("zxd", user);
final Expression variableName = spelExpressionParser.parseExpression("#zxd.name");
final String variable = variableName.getValue(evaluationContext, String.class);
assertEquals(root, variable);
} @Value(staticConstructor = "of")
private static class User {
private String name;
private int age;
} }

SpEL 实例的更多相关文章

  1. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  2. [Spring框架]Spring开发实例: XML+注解.

    前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...

  3. SPEL语言-Spring Expression Language

    Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts 2x中使用的OGNL表达式语言,能 ...

  4. Spring框架bean的配置(2):SpEL:引用 Bean、属性和方法。。。

    将这些架包放入在工程目录下建立的lib文件夹里,并解压 commons-logging-1.1.1 spring-aop-4.0.0.RELEASE spring-beans-4.0.0.RELEAS ...

  5. Spring表达式语言 之 5.3 SpEL语法(拾肆)

    5.3  SpEL语法 5.3.1  基本表达式 一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int.long.float.double).布尔类型.null类型. 类型 示例 字 ...

  6. Spring3.0提供的表达式语言spel

    package com.zf.spel; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.D ...

  7. SpEL快速入门

    Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图.与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板. ...

  8. Spring3表达式语言(SpEL)学习笔记

    最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...

  9. Echache整合Spring缓存实例讲解(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...

随机推荐

  1. js apply与call的用法与区别

    apply和call function Person(c, d) { return this.a + this.b + c + d } var  o = {a: 1, b: 2} Person.cal ...

  2. vue动态渲染图片,引用路径需要注意的地方

    1.把图片放在和src同级的static里面,这用按照正常的方式进行引入,例如: 2.图片可以在其他文件夹,但是在script引入是必须加上require <img :src="ite ...

  3. css练习小总结

    1.div水平居中:/*设置div宽度后,margin:0 auto:*/2.div显示在一行:/*float:left:*/ 3.text-align:/*后面标签里的内容水平居中:*/4.alig ...

  4. 【微信小程序】图片压缩-纯质量压缩,非长宽裁剪压缩

      原理:利用canvas来实现,将图片绘制到canvas上,然后canvas转图片时,微信提供的一个方法wx.canvasToTempFilePath(Object object, Object t ...

  5. 【Java】 ArrayList和LinkedList实现(简单手写)以及分析它们的区别

    一.手写ArrayList public class ArrayList { private Object[] elementData; //底层数组 private int size; //数组大小 ...

  6. Linux 开机文件系统发生错误

    1 如果/目录没有损毁,那么开机的时候,屏幕会提示:press root password or ctrl +D,这个时候请输入root密码登陆系统,然后进行如下操作: 1)在光标处输入root密码登 ...

  7. zabbix 图形注释乱码

    1.寻找字体文件 1.1 首先需要找到zabbix后台的字体文件路径,字体文件的后缀为.ttf [root@zabbix ~]# cd /usr/share/zabbix/ [root@zabbix ...

  8. ps制作雾的效果

    制作雾的效果 方法一: 新建图层,将前景色设置为白色,背景色为黑色(因为雾的颜色是根据前景色决定的,也可根据这个原理制作火焰效果) 选择滤镜->渲染->云彩(也可选择其他效果的云彩) (选 ...

  9. Gym-100923A-Por Costel and Azerah(DP)

    链接: https://vjudge.net/problem/Gym-100923A 题意: Por Costel the Pig has received a royal invitation to ...

  10. K8S in Action

    1,容器的概念 镜像 镜像仓库 容器 镜像层:Docker镜像由多层构成.好处:网络分发效率,减少镜像的存储空间 1.2 k8s 主节点 ,它承载着 Kubernetes 控制和管理整个集群系统的控制 ...