SpEL 实例
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 实例的更多相关文章
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- [Spring框架]Spring开发实例: XML+注解.
前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...
- SPEL语言-Spring Expression Language
Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts 2x中使用的OGNL表达式语言,能 ...
- Spring框架bean的配置(2):SpEL:引用 Bean、属性和方法。。。
将这些架包放入在工程目录下建立的lib文件夹里,并解压 commons-logging-1.1.1 spring-aop-4.0.0.RELEASE spring-beans-4.0.0.RELEAS ...
- Spring表达式语言 之 5.3 SpEL语法(拾肆)
5.3 SpEL语法 5.3.1 基本表达式 一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int.long.float.double).布尔类型.null类型. 类型 示例 字 ...
- Spring3.0提供的表达式语言spel
package com.zf.spel; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.D ...
- SpEL快速入门
Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图.与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板. ...
- Spring3表达式语言(SpEL)学习笔记
最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...
- Echache整合Spring缓存实例讲解(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...
随机推荐
- 几个常用I/O函数用法(printf,fprintf等)
一 格式化输出 1.printf 定义:int printf(const char *format,[argument]); 功能:产生格式化输出的函数(定义在 stdio.h 中) 参数说明:for ...
- kali 下安装 vmtools
网上的教程都是默认路径下的,kali是定制版本的,路径不同,所以首先要找到media下安装包的路径,然后进入该路下,将安装包复制到想要的路径下,并解压缩到想要的路径下,剩下的就跟网上的差不多了,即找到 ...
- ip - Linux IPv4 协议实现
SYNOPSIS(总览) #include <sys/socket.h> #include <net/netinet.h> tcp_socket = socket(PF_INE ...
- Matlab 快速多通道积分图计算函数
所谓快速多通道积分图计算,其实就是 cumsum2D. 我写了一个比较快的版本(比 VLFeat 的快),用 mex 编译一下就能用了. 代码 #include <string.h> #i ...
- Linux磁盘分区与lvm逻辑卷
硬盘接口的种类分四类:(价格由低到高) IDE SATA硬盘:别名串口硬盘,具有较强的纠错能力. SCSI硬盘:即采用SCSI接口的硬盘,SCSI接口具有应用范围广,多任务,带宽大,CPU占用率低. ...
- PAT Basic 1071 小赌怡情 (15 分)
常言道“小赌怡情”.这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对了,则系统奖励玩家 t 个 ...
- python中reload(sys)作用
python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错UnicodeDecodeError: 'ascii' codec can't decode ...
- 机器学习聚类算法之DBSCAN
一.概念 DBSCAN是一种基于密度的聚类算法,DBSCAN需要两个参数,一个是以P为中心的邻域半径:另一个是以P为中心的邻域内的最低门限点的数量,即密度. 优点: 1.不需要提前设定分类簇数量,分类 ...
- 一个web应用的诞生(6)
之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目的也是写出一个轻博客来,但是,在发表文章之前是不是要先记录一下登录状态呢? 用户登录 ...
- ZROI 19.07.31 AB班ACM
写在前面:非常感谢cjc和djh两位神仙带我,非常感谢他们给了我一次躺赢的机会. 虽然我被硬点成了代码手,但我写的基本每次都有一堆罚时.然而djh爷全部1A,tql. 题目按照一血时间升序,大致符合难 ...