SpEL概述
SpEL全称是Spring Expression Language是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。
SpEL使用场景
- 在注解@Value中
@Data public class User { @Value("#{'张三'}") private String userName; private String mobile; private String pwd; private int age; private String[] hobby; private Map<String,String> map; }
- 在XML配置中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.example.demo.service.HelloService"> <!-- 同@Value,#{}内是表达式的值,可放在property或constructor-arg内 --> <property name="arg" value="#{'hello world'.toUpperCase()}"> </bean> </beans>
- 在代码块中使用Expression(不是很常见,我在项目中几乎没有用到过)
@Test public void test(){ //创建ExpressionParser解析表达式 ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression("表达式"); //执行表达式,默认容器是spring本身的容器:ApplicationContext Object value = exp.getValue(); System.out.println(value); }
SpEL表达语法
1.字面量表达式
- 整数
#{123456}
- 浮点数
#{3.1415159}
- 布尔值
#{true}
- 字符串
#{'张三'}
- 集合
#{{'吃饭','睡觉','d打豆豆'}}
- map和对象
#{{'k1':'victory','k2':'haha'}}
2.调用java代码
- 直接使用new
#{new com.example.demo.entity.User()} #{}
- 使用T(Type)
#{T(Double).MIN_VALUE}
- 方法调用,和java代码差不多
#{'abc'.toUpperCase()}
- 安全保证,对上面调用方法的补充 ,为了避免操作对象本身可能为null,取属性时报错,定义语法 语法:“对象?.变量|方法”
#{'123'?.toUpperCase()}
3. 运算符表达式
1. 算术表达式 #{1+2-6*2} 2. 比较表达式 #{1>3} 3. 逻辑表达式 #{1!=2 && 2<3} 4.赋值表达式(是代码块中使用的,自测@Value中不好用) #{#variableName=value} 5. 三目表达式(“表达式1?表达式2:表达式3”) #{1!=2 && 2<3 ? '吃饭':'睡觉'} #{2!=null?2:3}等价于#{2?:3}后者称为Elvis运算符,可以避免null值报错的情况 6.正则表达式 #{'123'.matches('\d{3}')}
4.集合的操作
- 集合访问:"集合[索引]"和"map[key]"
#{{'吃饭','睡觉','打豆豆'}[0]} #{{'k1':'吃饭','k2':'睡觉','k3':'打豆豆'}[k3]}
- 集合的查询投影
".?[]":从集合中查询所有满足条件的 #{cities.?[population gt 2e7]} “.^[]”:从集合中查询第一个匹配项 #{cities.^[population gt 2e7]}" “.$[]”:从集合中查询最后一个匹配项。 #{cities.$[population gt 2e7]}" ".![]":投影运算符 #{cities.![name]}