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. 简单了解 node net 模块

    简单了解 node net 模块 文章记录了对net 模块的简单理解分析. net模块 简单使用 net.Server 类 net.Socket 类 总结 1.1 net模块 Node.js 的 Ne ...

  2. HashMap 的实现原理(1.8)

    详见:https://blog.csdn.net/richard_jason/article/details/53887222 HashMap概述 1.初始容量默认为16 最大为2的30次方,负载因子 ...

  3. SIP协议 会话发起协议(一)

    会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话. SIP - 概述 以下是有关SIP的几点注意事项 - S ...

  4. Dubble 入门

    Dubbo 01 架构模型 传统架构 All in One 测试麻烦,微小修改 全都得重新测 单体架构也称之为单体系统或者是单体应用.就是一种把系统中所有的功能.模块耦合在一个应用中的架构方式.其优点 ...

  5. 2017 ICPC 南宁 L 带权最大递增子序列

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...

  6. Ubuntu安装DroidCamX网络摄像头

    1.安装依赖项 sudo apt-get install gcc make linux-headers-`uname -r` 2.安装 cd /tmp/ bits=`getconf LONG_BIT` ...

  7. java课堂动手测试

    课堂实验3 一个Java类文件中真的只能有一个公有类吗? 经过测试,当含有两个public  类时会报错,不能执行,假如删除第二个public则可以正常生成,说明一个java文件只能有一个公有类. 课 ...

  8. thinkphp5杂谈--模板

    一种新型开源模板   http://www.h-ui.net/H-ui.admin.shtml 下载页面代码 除了curl以外还可以借助  仿站小工具V7.0,操作示意图

  9. 安装nginx 以及nginx负载均衡

    a  安装 [root@localhost ~]# yum -y install gcc automake autoconf libtool make yum install gcc gcc-c++ ...

  10. CodeForces-585B(BFS)

    链接: https://vjudge.net/problem/CodeForces-585B 题意: The mobile application store has a new game calle ...