- Spel快速查找手册
- 基础知识
- @Value的两种格式
- Spel Context的作用
- 取值
- 示例Java对象
- 获取对象中属性
- 获取集合里的对象
- 获取集合里对象的属性
- 获取对象
- 获取对象并调用方法
- 调用工具类的静态方法
- 不经常用,可以了解
- 集合判空
- 集合过滤
- 设值
- 基础类型以及包装类
- 集合设值
- 在属性上调用方法
- 备注
- 示例代码
- 文档
此博文为Spel速查手册,用来快速查找平时开发中会出现的Spel。如果需要更详细的代码示例,可在示例代码中找到
基础知识 @Value的两种格式在Springboot中,@Value有两种写法
-
${}写法,取Springboot属性文件application*.yml中的属性值
@Value("${jack.sparrow.name}") private Strinh
-
#{}写法,里面是spel表达式
@Value("#{spelEntity.name}") private String name;
像其他容器一样,负责Spel的解析
大致了解了上述这两个基础知识外,就可以进行Spel的学习了
取值因为平时开发中使用取值的场景较多,所以,先说Spel取值。可以思考一下平时一个Java对象里放的都有哪些属性,然后根据这些属性,思考如何取值,进行针对性学习,可以快速入门Spel。
示例Java对象如上所述,建立一个Java对象。平时开发中,里面放的最多的也就是包装类型、集合类型、其他Java对象。大体上就这么三类
@Getter @Setter @ToString public class SpelEntity { private Integer age = new Integer(2021); private String name = "jacksparrow"; private Boolean child; private Listlist; private Map map; private SpelAnotherEntity anotherEntity; private List objectList; private Map objectMap; public Date myDate() { return Calendar.getInstance().getTime(); } }
@Getter,@Setter,@ToString均属于Lombok注解,有兴趣可以了解,这里不做过多介绍。
自己可以new一个该对象,并给属性设置一些示例值。这里使用expressionParser来进行Spel的解析
expressionParser parser = new SpelexpressionParser();获取对象中属性
log.info("获取name属性的值为{}", parser.parseexpression("name").getValue(spelEntity)); log.info("获取age属性的值为{}", parser.parseexpression("age").getValue(spelEntity)); log.info("获取child属性的值为{}", parser.parseexpression("child").getValue(spelEntity));获取集合里的对象
// 访问集合时,list直接通过index访问,map直接通过【key】访问,如果key是字符串,则通过【'key'】访问 log.info("获取list第一项的值为{}", parser.parseexpression("list[0]").getValue(spelEntity)); log.info("获取map属性中key为1的值为{}", parser.parseexpression("map[1]").getValue(spelEntity));获取集合里对象的属性
// 获取对象List的属性时,和正常一样list[index]获取到的是里面对象,访问对象的属性通过【.属性】 log.info("访问对象List集合的属性{}", parser.parseexpression("objectList[0].date").getValue(spelEntity)); // 获取对象map中的value为对象时,访问具体属性,依旧通过【.属性】访问 log.info("访问对象Map集合的属性{}", parser.parseexpression("objectMap['objectKey'].date").getValue(spelEntity));获取对象
通过Spel表达式获取对象,并返回该对象
// 获取属性或对象时,在getValue中需【设置返回的类型】是什么 SpelAnotherEntity spelAnotherEntity = parser.parseexpression("anotherEntity").getValue(spelEntity, SpelAnotherEntity.class); log.info("获取spelEntity中的对象属性{}", spelAnotherEntity); // 获取对象Map属性时,返回类型设置为Map,用具体的Map获取对象并调用方法接收即可 Map objectMap1 = parser.parseexpression("objectMap").getValue(spelEntity, Map.class);
log.info("调用toUpperCase方法值为{}", parser.parseexpression("list[0].toUpperCase()").getValue(spelEntity));
调用某些不是JDK自带的,比如是我们自己写的方法,拿构造方法举例
SpelAnotherEntity value1 = parser.parseexpression("new com.learn.spring.springuse.advanced.spel.SpelAnotherEntity()").getValue(spelEntity, SpelAnotherEntity.class);调用工具类的静态方法
格式为T(类的完全限定名).方法(参数)
log.info("调用静态方法的方法值为{}", parser.parseexpression("T(org.springframework.util.StringUtils).capitalize(list[1])").getValue(spelEntity));不经常用,可以了解
以下这些属于平时开发中不太常用的,但是可以了解一下,毕竟知道了也没坏处不是
集合判空访问集合中的元素,或者集合中元素的属性,一旦该元素不存在,那么访问其属性会报NPE。如何处理这种情况呢?
// 访问集合属性时元素不存在或者index过大应该怎么防止报错?使用三目运算,假设我要访问第4个元素,判断list的size是否小于4,如果小于4则返回null log.info("访问集合时判断是否超过集合值为{}", parser.parseexpression("list.size() < 4 ? null:list[3]").getValue(spelEntity)); log.info("获取map中不存在的对象的属性防止NPE(Null Pointer Exception)异常{}", parser.parseexpression("objectMap['objectKeys']?.date").getValue(spelEntity));集合过滤
list过滤
// 按照过滤条件找出集合中符合条件的元素,过滤之后返回的是集合,如果在list中过滤,则返回list,在map中过滤,返回map // 使用格式 ?.[条件] // 这里使用#this,表示当前对象 ListfilterList = (List ) parser.parseexpression("list.?[#this =='china']").getValue(spelEntity); log.info("list集合过滤后的值为{}", filterList.get(0)); // 对于集合过滤之后会返回满足条件的所有元素,如何返回第一个、最后一个匹配的元素 // 返回第一个 .^[条件] // 返回最后一个 .$[条件] log.info("获取list中匹配的第一个值{}", parser.parseexpression("list.^[#this == 'china']").getValue(spelEntity)); log.info("获取list中匹配的第一个值{}", parser.parseexpression("list.$[#this == 'china']").getValue(spelEntity));
map过滤
Map设值 基础类型以及包装类filterKeyMap = (Map ) parser.parseexpression("map.?[key == 1]").getValue(spelEntity); Map filterValueMap = (Map ) parser.parseexpression("map.?[value == 100]").getValue(spelEntity); log.info("map集合Key过滤后的值为{}", filterKeyMap); log.info("map集合Value过滤后的值为{}", filterValueMap);
对于这些类型,平时开发中直接在@Value("#{spel表达式}")中设置对应的值即可
@Value("#{1}") private Integer code; @Value("#{'initString'}") private String initStr; @Value("#{true}") private Boolean initBool;集合设值
集合设值使用=={}==表示集合,集合类型为list,则直接在{}写元素值即可;集合类型为Map,则在{}以key:value的形式写即可。集合各个元素之间用逗号分隔。
@Value("#{ {'jack', 'jan'} }") private List在属性上调用方法integerList; @Value("#{ {1, 2,3} }") private List stringList; @Value("#{ {'china':1, 'usa':2, 'japan':3} }") private Map map;
可取值那里一样,这里简单给个例子
// 为当前对象中的对象属性赋值,通过调用其构造方法 @Value("#{ new com.learn.spring.springuse.advanced.spel.SpelEntity() }") private SpelEntity spelEntity; // 调用静态方法 @Value("#{ T(com.google.common.collect.Lists).newArrayList() }") private List备注 示例代码initListByGuava;
- 文中完整的示例代码
- Spel官方文档
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)