SpEL(Spring表达语言)表达式详述

简介: SpEL全称是Spring Expression Language是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。

SpEL概述



SpEL全称是Spring Expression Language是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。


SpEL使用场景



  1. 在注解@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;
}


  1. 在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>


  1. 在代码块中使用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.字面量表达式


  1. 整数
#{123456}


  1. 浮点数
#{3.1415159}


  1. 布尔值
#{true}


  1. 字符串
#{'张三'}


  1. 集合
#{{'吃饭','睡觉','d打豆豆'}}


  1. map和对象
#{{'k1':'victory','k2':'haha'}}


2.调用java代码


  1. 直接使用new
#{new com.example.demo.entity.User()}
#{}


  1. 使用T(Type)
#{T(Double).MIN_VALUE}


  1. 方法调用,和java代码差不多
#{'abc'.toUpperCase()}


  1. 安全保证,对上面调用方法的补充 ,为了避免操作对象本身可能为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.集合的操作


  1. 集合访问:"集合[索引]"和"map[key]"
#{{'吃饭','睡觉','打豆豆'}[0]}
#{{'k1':'吃饭','k2':'睡觉','k3':'打豆豆'}[k3]}


  1. 集合的查询投影
".?[]":从集合中查询所有满足条件的
#{cities.?[population gt 2e7]} 
“.^[]”:从集合中查询第一个匹配项
#{cities.^[population gt 2e7]}"
“.$[]”:从集合中查询最后一个匹配项。
#{cities.$[population gt 2e7]}"
".![]":投影运算符
#{cities.![name]}


目录
相关文章
|
4月前
|
Java Maven Spring
【Spring】EL表达式失效的问题(添加 isELIgnored)
【Spring】EL表达式失效的问题(添加 isELIgnored)
|
29天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
66 1
|
2月前
|
XML 前端开发 Java
深入理解Spring EL表达式的高级功能
深入理解Spring EL表达式的高级功能
82 1
|
2月前
|
XML 前端开发 Java
掌握Spring EL表达式的基础知识
掌握Spring EL表达式的基础知识
38 1
|
3月前
|
XML Java 数据格式
spring AOP切入点execution表达式
spring AOP切入点execution表达式
|
4月前
|
XML Java 数据格式
演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP
演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP
42 0
|
4月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
48 0
|
4月前
|
Java Spring
spel获取spring bean
spel获取spring bean
39 0
|
5月前
|
Java Spring
Spring中的表达式语言SpEL详解
Spring中的表达式语言SpEL详解
63 0
|
6月前
|
Java API Spring
Spring判断方法名是符合给定的SPEL+表达式的+API
Spring判断方法名是符合给定的SPEL+表达式的+API
53 0