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


目录
相关文章
|
7月前
|
Java Maven Spring
【Spring】EL表达式失效的问题(添加 isELIgnored)
【Spring】EL表达式失效的问题(添加 isELIgnored)
|
7月前
|
数据安全/隐私保护
Spring-AOP切入点表达式详解
Spring-AOP切入点表达式详解
120 0
|
7月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
540 1
|
4月前
|
Java 开发者 Spring
|
6月前
|
前端开发 安全 Java
Spring EL表达式:概念、特性与应用深入解析
Spring EL表达式:概念、特性与应用深入解析
|
7月前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
564 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
5月前
|
安全 Java 数据库
Spring Boot中的Kotlin语言支持
Spring Boot中的Kotlin语言支持
|
7月前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
80 5
|
7月前
|
XML 前端开发 Java
深入理解Spring EL表达式的高级功能
深入理解Spring EL表达式的高级功能
534 1
|
7月前
|
XML 前端开发 Java
掌握Spring EL表达式的基础知识
掌握Spring EL表达式的基础知识
199 1