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]}