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. Flask开发系列之Web表单

    Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_template app = Flask(__name__) @app.ro ...

  2. Big Data(七)MapReduce计算框架(PPT截图)

    一.为什么叫MapReduce? Map是以一条记录为单位映射 Reduce是分组计算

  3. Find the hotel HDU - 3193 (ST表RMQ)

    Summer again! Flynn is ready for another tour around. Since the tour would take three or more days, ...

  4. 前端批量迁移NAS存储

    在实际生产中,老的NAS存储无法扩容,需要迁移到新的存储,种种原因只能前端迁移. 系统:Linux 容量:1.5T 为了减少对生产系统的影响. 1.提前将老的存储数据备份到新的存储上: 2.正试割接存 ...

  5. ELF程序头部及程序加载

    程序头部 程序头部描述与程序执行直接相关的目标文件结构信息.用来在文件中定位各个段的映像.同时包含其他一些用来为程序创建进程映像所必需的信息. 可执行文件或者共享目标文件的程序头部是一个结构数组,每个 ...

  6. Linux 性能测试工具Lmbench详解

    Linux 性能测试工具Lmbench详解 2010-06-04 16:07 佚名 评测中心 字号:T | T Lmbench 是一套简易可移植的,符合ANSI/C 标准为UNIX/POSIX 而制定 ...

  7. windows下查看C语言字符数组(俗称:字符串)在内存中地址信息的操作过程

      #include <stdio.h> #pragma warning(disable:4996) int power10(int n) { ) { ; } ; ; i < n; ...

  8. 常用数列总结&性质记录

    1.斐波那契数列 P.S.:这里首项下标为 1 递推式:\[F_i=F_{i-1}+F_{i-2},F_1=F_2=1\] 性质: \(1.\sum^{n}_{i=1}F_{i}=F_{n+2}-1\ ...

  9. day_05 if条件判断和while循环作业题

    1. 输入姑娘的年龄后,进行以下判断: 1. 如果姑娘小于18岁,打印“不接受未成年” 2. 如果姑娘大于18岁小于25岁,打印“心动表白” 3. 如果姑娘大于25岁小于45岁,打印“阿姨好” 4. ...

  10. 【ZJOI2009】狼和羊的故事

    题目 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! ...