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. java复习(3)继承下

    一.抽象类 ------------------------------------- 1.抽象定义概述:抽象类时从多个事物中奖共性的,本质的内容抽取出来 例如:狼和狗共性都是犬科,犬科就是抽象出来的 ...

  2. 关于在docker中配置elasticsearch容器的方法

    一.关于docker的安装,注意几点 1.如果系统是Win10家庭版,是没有Hyper-V的,所以无法安装docker(运行docker安装包会报错),为此docker官网提供的解决方法是安装dock ...

  3. SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用

    这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法.INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下 一.SQLite清空表 ...

  4. C++ 程序设计语言

    好记性不如烂笔头. 第六章 标准库给出了静态断言,形式类似如下: stastic_assert(A,S);//当A不为true时,把S作为一条编译器错误信息输出 其最重要的用途是为泛型编程中作为形参的 ...

  5. python变量与常量内容:

    ''' python变量与常量内容: ''' # 变量:定义世间万物变化的状态 ''' height 180 weight 140 age 18 tree_name yuyang ''' # prin ...

  6. 【洛谷P2922】Secret Message

    题目大意:给定 N 个字符串组成的字典,有 M 个询问,每次给定一个字符串,求字典中有多少个单词为给定字符串的前缀或前缀是给定的字符串. 题解:在 trie 上维护一个 tag 表示有多少字符串以当前 ...

  7. Windows 2012 R2 DataCenter服务器 重启之后,其他加域电脑无法访问域账户

    需在域控服务器重启,服务Kerberos Key

  8. postgresql查询栅格数据范围(extent)

    栅格数据: SELECT ST_Extent(rast::geometry) as bextent FROM tmean_19; 矢量数据: SELECT ST_Extent(way) as bext ...

  9. luogu P1063 能量项链 x

    P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...

  10. Shoi2017试题泛做

    一口气做完六个省的省选(误) Day1 [Shoi2017]期末考试 枚举最大的天数,然后代价贪心地O(1)计算. #include <cstdio> #include <algor ...