跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Spring SpEL表达式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Spring SpEL表达式}} '''Spring表达式语言(Spring Expression Language,SpEL)'''是Spring框架提供的一种强大的表达式语言,支持在运行时查询和操作对象图。它类似于其他表达式语言(如OGNL或MVEL),但专为Spring生态系统设计,可与Spring配置、注解及各种Spring模块无缝集成。 == 概述 == SpEL的主要特点包括: * '''动态求值''':在运行时解析表达式,支持条件逻辑和数学运算 * '''类型转换''':自动处理类型转换,简化表达式编写 * '''方法调用''':支持调用对象方法和构造函数 * '''集合操作''':提供对集合元素的查询、筛选和投影 * '''安全访问''':通过语法糖安全访问可能为null的对象 === 基本语法 === SpEL表达式通常包含在<code>#{...}</code>分隔符中(在XML配置中),或使用<code>T()</code>操作符访问静态成员。表达式由字面量、属性引用、方法调用等组成。 == 核心功能 == === 字面量表达式 === <syntaxhighlight lang="java"> // 数字和字符串 #{3.14159} #{'Hello SpEL'} // 布尔值 #{true} </syntaxhighlight> === 属性访问 === 支持点号记法和方括号记法: <syntaxhighlight lang="java"> // 假设有对象user,其name属性为"Alice" #{user.name} // 返回"Alice" #{user['name']} // 等效写法 </syntaxhighlight> === 方法调用 === <syntaxhighlight lang="java"> // 调用String的substring方法 #{'Spring SpEL'.substring(7)} // 返回"SpEL" // 调用静态方法 #{T(java.lang.Math).random()} </syntaxhighlight> === 运算符 === SpEL支持标准数学、关系和逻辑运算符: {| class="wikitable" |+ SpEL运算符示例 |- ! 类型 !! 运算符 !! 示例 |- | 数学 | <code>+ - * / % ^</code> | <code>#{2 * 3 + 5}</code> |- | 关系 | <code>> >= < <= == !=</code> | <code>#{user.age > 18}</code> |- | 逻辑 | <code>and or not</code> | <code>#{not user.active}</code> |- | 三元 | <code>?:</code> | <code>#{user.vip ? 'Premium' : 'Standard'}</code> |} === 集合操作 === <mermaid> graph LR A[集合操作] --> B[访问元素] A --> C[筛选] A --> D[投影] A --> E[聚合] </mermaid> 示例: <syntaxhighlight lang="java"> // 访问List元素 #{users[0].name} // 使用选择运算符(.?[])筛选 #{users.?[age > 25]} // 返回年龄大于25的用户集合 // 使用投影运算符(.![])提取属性 #{users.![name]} // 返回所有用户名的集合 </syntaxhighlight> == 高级特性 == === 类型转换 === SpEL自动处理基本类型转换: <syntaxhighlight lang="java"> // 字符串转数字 #{'100' + 5} // 结果为105 </syntaxhighlight> === 变量上下文 === 可通过<code>EvaluationContext</code>设置变量: <syntaxhighlight lang="java"> ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new EvaluationContext(); context.setVariable("limit", 100); Expression exp = parser.parseExpression("#users.?[age > #limit]"); </syntaxhighlight> === 安全导航操作符 === 避免NullPointerException: <syntaxhighlight lang="java"> #{user?.address?.city} // 如果user或address为null,返回null而非抛出异常 </syntaxhighlight> == 实际应用案例 == === 案例1:动态配置 === 在<code>@Value</code>注解中使用SpEL: <syntaxhighlight lang="java"> @Value("#{systemProperties['user.timezone']}") private String timezone; @Value("#{T(java.lang.Math).random() * 100.0}") private double randomPercentage; </syntaxhighlight> === 案例2:Spring Security表达式 === 在安全配置中使用SpEL: <syntaxhighlight lang="java"> @PreAuthorize("hasRole('ADMIN') or #user.id == authentication.name") public void updateUser(User user) { // 方法实现 } </syntaxhighlight> === 案例3:XML配置中的条件注入 === <pre> <bean id="dataSource" class="com.example.DataSource"> <property name="cacheSize" value="#{systemEnvironment['CACHE_SIZE'] ?: 100}"/> </bean> </pre> == 性能考虑 == * SpEL表达式在首次求值时会被编译,后续调用性能接近原生Java代码 * 复杂表达式应考虑缓存<code>Expression</code>对象 * 避免在频繁调用的代码路径中使用复杂SpEL表达式 == 最佳实践 == 1. 优先使用简单表达式,复杂逻辑应移入Java代码 2. 对重复使用的表达式进行预编译 3. 在可能为null的对象链中使用安全导航操作符 4. 为表达式添加清晰的注释说明业务意图 == 数学表达式支持 == SpEL支持通过<math>标记处理数学公式: <math> E = mc^2 </math> 在表达式中可这样使用: <syntaxhighlight lang="java"> #{T(java.lang.Math).pow(mass, 2) * speedOfLight} </syntaxhighlight> == 总结 == Spring SpEL为Spring应用程序提供了强大的运行时表达式处理能力,从简单的属性访问到复杂的条件逻辑都能优雅处理。通过合理使用SpEL,可以显著减少样板代码,提高配置的灵活性和可读性。 [[Category:后端框架]] [[Category:Spring]] [[Category:Spring高级特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)