当前位置: 首页 > news >正文

SpEL(Spring Expression Language)学习笔记

一、什么是 SpEL?

​SpEL(Spring Expression Language)​​ 是 Spring 框架提供的一种​​强大的表达式语言​​,用于在​​运行时查询和操作对象图​​。

  • 类似于:JSP EL、OGNL、Thymeleaf 表达式等
  • 主要作用:​​动态注入值、调用方法、操作对象与集合、逻辑判断等​
  • 使用范围:
    • Spring 配置(XML / 注解)
    • @Value 注解
    • Spring Security 表达式
    • Spring Data(如 @Query)
    • Thymeleaf 等模板引擎

二、基本语法

  • ​表达式写法​​:使用 #{ ... } 包含
  • ​示例​​:
    <property name="name" value="#{'Hello, SpEL'}" />
    @Value("#{systemProperties['user.name']}")
    private String userName;

三、SpEL 常见用法

1️⃣ 字面量

类型示例
数字#{123}, #{3.14}
字符串#{'Hello SpEL'}
布尔值#{true}, #{false}

2️⃣ 引用 Bean、属性、方法

假设有一个 Bean:

@Component
public class User {private String name = "Alice";// getter 方法public String getName() { return name; }
}

使用方式:

@Value("#{user}")                // 注入整个 User 对象
@Value("#{user.name}")          // 获取属性 name 的值
@Value("#{user.getName()}")     // 调用方法
@Value("#{user.getName().toUpperCase()}") // 方法链式调用

3️⃣ 运算符

① 算术运算
#{1 + 2 * 3}        // 7
#{(1 + 2) * 3}      // 9
#{10 % 3}           // 1 (取余)
② 调用静态方法
#{T(java.lang.Math).random()}      // 随机数 [0,1)
#{T(java.lang.Math).PI}            // 圆周率 PI

T(全限定类名) 用于引用类,可调用其静态方法和字段。

③ 关系运算
#{age > 18}
#{score >= 60}
#{name == 'Tom'}
#{name != 'Jerry'}
④ 逻辑运算
#{age > 18 && score > 60}
#{age < 18 || hasDiscount}
⑤ 三元运算符(条件表达式)
#{score >= 60 ? '及格' : '不及格'}

4️⃣ 集合操作

假设一个 Bean 中定义了:

public class DataBean {private List<String> names = Arrays.asList("Alice", "Bob", "Cathy");private Map<String, Integer> scores = new HashMap<>();// scores.put("Alice", 90);
}

使用方式:

@Value("#{dataBean.names[0]}")           // Alice(第一个元素)
@Value("#{dataBean.names[1]}")           // Bob
@Value("#{dataBean.scores['Alice']}")    // 90// 集合过滤
@Value("#{dataBean.names.?[startsWith('A')]}" )  // 找出以 A 开头的名字// 集合投影 / 选择
@Value("#{dataBean.names.![toUpperCase()]}")     // 所有名字转大写// 首尾元素
@Value("#{dataBean.names.^[0]}")    // 第一个元素
@Value("#{dataBean.names.$[2]}"}    // 第三个元素(或根据实现可能是最后一个)
  • ?[] :过滤集合
  • ^[0] :第一个元素
  • $[0].[size-1] :最后一个元素(视具体版本而定)
  • .![] :对每个元素执行操作(投影)

5️⃣ 其他特性

功能说明示例
​调用静态字段/方法​使用 T(类全名)#{T(java.lang.Math).PI}
​正则匹配​使用 matches 方法#{user.name matches '[A-Za-z]+'}
​空安全导航​避免 NPE,如 ?.(SpEL 自身不直接支持,但可通过方法避免)建议配合方法设计

四、SpEL 常见使用场景

✅ 1. @Value 动态注入

@Value("#{systemProperties['user.dir']}")        // 系统属性
@Value("#{T(java.lang.Math).random() * 100}")    // 随机数
@Value("#{userService.currentUser.name}")        // 引用其他 Bean 的属性

✅ 2. Spring XML 配置

<bean id="example" class="com.example.Example"><property name="message" value="#{'Hello, ' + 'SpEL'}" /><property name="value" value="#{T(java.lang.Math).PI}" />
</bean>

✅ 3. Spring Security 权限控制

@PreAuthorize("hasRole('ADMIN') or #id == authentication.principal.id")
public void deleteUser(Long id) {// 只有管理员或本人可以删除
}

五、SpEL 核心符号/关键字

符号/关键字说明
#{...}SpEL 表达式语法
#root表达式上下文的根对象
#this当前正在处理的对象
#variable表达式内定义的变量
T(类全名)引用类,用于调用静态方法/字段
?[]集合过滤
^[0]第一个元素
$[0]最后一个元素(某些实现)

六、SpEL 优点总结

优点说明
✅ ​​强大灵活​支持对象操作、方法调用、集合处理、逻辑运算等
✅ ​​动态性​表达式在运行时解析,支持动态值
✅ ​​与 Spring 无缝集成​广泛用于配置、注解、安全、数据访问等
✅ ​​可读性好​语法直观,易于理解和使用

七、📌 小结:SpEL 常用表达式速查

功能示例
字符串字面量#{'Hello SpEL'}
数字运算#{1 + 2 * 3}
调用方法#{user.getName()}
调用静态方法#{T(Math).random()}
属性引用#{user.name}
三元表达式#{score >= 60 ? '及格' : '不及格'}
集合取值#{dataBean.names[0]}
集合过滤#{dataBean.names.?[startsWith('A')]}
系统属性#{systemProperties['user.name']}

🎯 建议学习路径

  1. ​掌握基础语法​​:字面量、引用、运算符
  2. ​学会引用 Bean 和属性​​:#{bean.property}
  3. ​尝试方法调用与静态方法​​:#{bean.method()}, #{T(Math).PI}
  4. ​练习集合操作​​:过滤、取元素、遍历等
  5. ​在实际场景使用​​:如 @Value 注入、XML 配置、权限控制等

http://www.dtcms.com/a/388805.html

相关文章:

  • Java 字节码进阶3:面向对象多态在字节码层面的原理?
  • Tensor :核心概念、常用函数与避坑指南
  • 机器学习实战·第四章 训练模型(1)
  • 一次因表单默认提交导致的白屏排查记录
  • Linux:io_uring
  • 《第九课——C语言判断:从Java的“文明裁决“到C的“原始决斗“——if/else的生死擂台与switch的轮盘赌局》
  • 学习日报|Spring 全局异常与自定义异常拦截器执行顺序问题及解决
  • Spring Boot 参数处理
  • Debian系统基本介绍:新手入门指南
  • Spring Security 框架
  • Qt QPercentBarSeries详解
  • RTT操作系统(3)
  • DNS服务管理
  • IDA Pro配置与笔记
  • 虚函数表在单继承与多继承中的实现机制
  • 矿石生成(1)
  • Linux 线程的概念
  • Unity学习之资源管理(Resources、AssetDatabase、AssetBundle、Addressable)
  • LG P5138 fibonacci Solution
  • 删除UCPD监控服务或者监控驱动
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(33):文法運用第10回1+(考え方14)
  • 向量技术研究报告:从数学基础到AI革命的支柱
  • 802.1x和802.1Q之间关联和作用
  • 基于大模型多模态的人体体型评估:从“尺码测量”到“视觉-感受”范式
  • 更符合人类偏好的具身导航!HALO:面向机器人导航的人类偏好对齐离线奖励学习
  • Transformer多头注意力机制
  • git 分支 error: src refspec sit does not match any`
  • VN1640 CH5 I/O通道终极指南:【VN1630 I/O功能在电源电压时间精确度测试中的深度应用】
  • qt QHorizontalBarSeries详解
  • 半导体制造的芯片可靠性测试的全类别