Spring 表达式语言

Spring学习(二十三)Spring表达式语言介绍 Spring表达式语言(Spring Expression Language)简称:SpEL 课程概要: Spring表达式语言的入门介绍Spring表达式语言的操作范围Spring表达式语言的运算符Spring表达式语言的集合操作 一.Spring表达式语言入门级介绍 1.基本概述        Spring表达式语言全称为“Spring Expression La 阅读详情

Spring 表达式语言 (Spring Expression Language) SpEL
分类: Spring2012-03-07 21:46 605 人阅读 评论(0) 收藏 举报
Spring 3.0 创建了一种新的方式用以配置对象的注入(set 注入或者构造参数注入),它便
是 SpEL (Spring Expression Language)下面我们一一做一介绍。
▲基础特性
——SpEL 使用#{…}作为定界符,所有在大框号中的字符都将被认为是 SpEL.
——1、 字面量的表示

1>整数

[html] view plaincopy
1. <property name="count" value="#{5}"/>

2>小数

[html] view plaincopy
1. <property name="frequency" value="#{89.7}"/>

3>科学计数法

[html] view plaincopy
1. <property name="capacity" value="#{1e4}"/>

4>String 可以使用单引号或者双引号作为字符串的定界符号。

[html] view plaincopy
1. <property name="name" value="#{'Chuck'}"/>
2. <property name='name' value='#{"Chuck"}'/>

5>Boolean

[html] view plaincopy
1. <property name="enabled" value="#{false}"/>

——2、 引用 Bean,属性和方法
1>引用其他对象

[html] view plaincopy
1. <bean id=”saxophone” value=”com.xxx.xxx.Xxx”/>
2. <bean ..>
3. .
4. <property name="instrument" value="#{saxophone}"/>
5. .
6. <bean/>

通过 id:“saxophone”将对象注入到 instrument 属性中,这与下面的配置是一样的:

[html] view plaincopy
1. <property name="instrument" ref="saxophone"/>

2> 引用其他对象的属性

[html] view plaincopy
1. <bean id="carl"
2. class="com.springinaction.springidol.Instrumentalist">
3. <property name="song" value="#{kenny.song}" />
4. </bean>

kenny 是 Bean Id 而 song 是属性的名字,这样配置就如同我们写了如下的代码

[java] view plaincopy
1. Instrumentalist carl = new Instrumentalist();
2. carl.setSong(kenny.getSong());

3>调用其他方法

[html] view plaincopy
1. <property name="song" value="songSelector.selectSong()"/>

调用了 BeanId 为“songSelector”的对象的 selectSong()方法,并将返回值注入到 song 属性
中。或者还可以链式操作。如下:

[html] view plaincopy
1. <property name="song" value="songSelector.selectSong().toUpperCase()"/>

如果 songSelector.selectSong()返回 null 的还会抛出异常,为了避免我们要使用?.表达式。
这样如果 songSelector.selectSong()为 null 就不会再调用后面的方法了。如下

[html] view plaincopy
1. <property name="song" value="songSelector.selectSong()?.toUpperCase()"/>

4>调用静态方法
我们已经知道如何通过一个对象调用它的方法了,但是如何调用一个静态方法呢?用 T()。
它将返回一个 Class object
然后我们再调用相应的方法即可:

[html] view plaincopy
1. <property name="multiplier" value="T(java.lang.Math).PI"/>

▲SpEL 支持的运算符号
——1、算数运算符:+, -, *, /, %, ^

[html] view plaincopy
1. <property name="adjustedAmount" value="#{counter.total + 42}"/>
2. <property name="adjustedAmount" value="#{counter.total - 20}"/>
3. <property name="circumference" value="#{2 * T(java.lang.Math).PI * circle.ra
dius}"/>
4. <property name="average" value="#{counter.total / counter.count}"/>
5. <property name="remainder" value="#{counter.total % counter.count}"/>
6. <property name="area" value="#{T(java.lang.Math).PI * circle.radius ^ 2}"/>

加号还可以用作字符串连接

[html] view plaincopy
1. <property name="fullName" value="#{performer.firstName + ' ' + performer.las
tName}"/>

——2、比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge

[html] view plaincopy
1. <property name="equal" value="#{counter.total == 100}"/>

不可以使用<和>号,应为在 xml 中它有特殊的含义,我们使用 lt 和 gt 代替

[html] view plaincopy
1. <property name="hasCapacity" value="#{counter.total le 100000}"/>

——3、 逻辑运算符号: and, or, not, |

[html] view plaincopy
1. <property name="largeCircle" value="#{shape.kind == 'circle' and shape.perim
eter gt 10000}"/>
2. <property name="outOfStock" value="#{!product.available}"/>
3. <property name="outOfStock" value="#{not product.available}"/>

——4、 If-else 运算符:?: (ternary), ?: (Elvis)
〇最基本的 ?:(这如同我们在使用 EL 表达式语言):

[html] view plaincopy
1. <property name="instrument" value="#{songSelector.selectSong() == 'Jingle Be
lls' ? piano : ' Jingle Bells '}"/>

〇变体的 ?:

<property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}"/>

上下两种是同一语义,但下面的明显简洁

[html] view plaincopy
1. <property name="song" value="#{kenny.song ?: 'Greensleeves'}"/>

——5、 正则表达式:matches

[html] view plaincopy
1. <property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@
[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}"/>

表达式返回逻辑值,如果匹配返回 true,否则返回 false
▲SpEL 对集合的支持
——环境
有实体 City 定义如下:

[java] view plaincopy
1. package com.habuma.spel.cities;
2. public class City {
3. private String name;
4. private String state;
5. private int population;
6. }

Xml 中有如下定义

[html] view plaincopy
1. <util:list id="cities">
2. <bean class="com.habuma.spel.cities.City"
3. p:name="Chicago" p:state="IL" p:population="2853114"/>
4. <bean class="com.habuma.spel.cities.City"
5. p:name="Atlanta" p:state="GA" p:population="537958"/>
6. <bean class="com.habuma.spel.cities.City"
7. p:name="Dallas" p:state="TX" p:population="1279910"/>
8. <bean class="com.habuma.spel.cities.City"
9. p:name="Houston" p:state="TX" p:population="2242193"/>
10. <bean class="com.habuma.spel.cities.City"
11. p:name="Odessa" p:state="TX" p:population="90943"/>
12. <bean class="com.habuma.spel.cities.City"
13. p:name="El Paso" p:state="TX" p:population="613190"/>
14. <bean class="com.habuma.spel.cities.City"
15. p:name="Jal" p:state="NM" p:population="1996"/>
16. <bean class="com.habuma.spel.cities.City"
17. p:name="Las Cruces" p:state="NM" p:population="91865"/>
18. </util:list>

——1、 获取 Collection 中的某个对象
〇通过下标访问,如下:

[html] view plaincopy
1. <property name="chosenCity" value="#{cities[2]}"/>

我们就会获得 population 为"1279910"的 city(记住下标从 0 开始)
〇下标可以通过变量指定,如下:

[html] view plaincopy
1. <property name="chosenCity" value="#{cities[T(java.lang.Math).random() * cit
ies.size()]}"/>

〇如果是从 Map 中获得,可指定 key 值,如下

[html] view plaincopy
1. <property name="chosenCity" value="#{cities['Dallas']}"/>

〇也可以通过 key 访问 properties 的值,如下
[

html] view plaincopy
1. <util:properties id="settings" location="classpath:settings.properties"/>
2. <property name="accessToken" value="#{settings['twitter.accessToken']}"/>

〇可以通过下标访问 systemEnvironment 和 SystemProperties 中的值

[html] view plaincopy
1. <property name="homePath" value="#{systemEnvironment['HOME']}"/>
〇如果在 jre 运行时配置了-Dapplication.home=/etc/myapp,我们可以通过如下方式访问
[html] view plaincopy
1. <property name="homePath" value="#{systemProperties['application.home']}"/>

〇通过下标获取 String 串中的某个字符
[html] view plaincopy

1. 'This is a test'[3]

——2、获取 Collection 中的子集-通过条件筛选(注意新对象是一个新的 Collection)
1>筛选子集(.?[])

[html] view plaincopy
1. <property name="bigCities" value="#{cities.?[population gt 100000]}"/>

2>获取第一个(.1)

[html] view plaincopy
1. <property name="aBigCity" value="#{cities.^[population gt 100000]}"/>

3>获取最后一个(.$[])

[html] view plaincopy
1. <property name="aBigCity" value="#{cities.$[population gt 100000]}"/>

——3、集合的投影(.![])
如果想获得所有城市的名称组成的列表,可用如下操作

[html] view plaincopy
1. <property name="cityNames" value="#{cities.![name]}"/>

将返回"Chicago", “Atlanta”, “Dallas”
也可以组合两个列,如下:

[html] view plaincopy
1. <property name="cityNames" value="#{cities.![name + ', ' + state]}"/>

将返回"Chicago, IL", “Atlanta, GA”, and “Dallas, TX”.
—— 4、将投影和筛选结合

[html] view plaincopy
1. <property name="cityNames" value="#{cities.?[population gt 100000].![name +
', ' + state]}"/>

  1. ↩︎

Spring:表达式语言 Spring表达式语言介绍 阅读详情

相关推荐

Spring 表达式语言 - SpEL

文章目录Spring 表达式语言 - SpEL1、什么是SpEL2、表达式语言支持以下功能3、使用Spring 的SpEL 进行简单构建4、调用方法5、级联嵌套和公共属性6、调用构造函数7、布尔运算 Spring 表达式语言 - SpEL 1、什么是SpEL Spring表达式语言(简称SpEL)是一种功能强大的表达式语言,支持在运行时查询和操纵对象图。语言语法与Unified EL相似,但提供...

简简单单Onlinezuozuo 4686

Spring 表达式语言(SpEL)

SpEL

lanluyug的博客 2240

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南

减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。

楚山之石的博客 1225

Spring配置文件对于占位符 ${} 的解析源码分析

1. 前言 由于公司新项目的搭建,而且选择了 spring boot,对于 spring boot 其中的好处就是我们无需在为其配置大量的 XML,完全可以基于注解的方式来进行配置,但也没有完全采用 java config 配置,至少在我们项目中是结合起来用的,比如 dubbo 的配置等等。 1.1 第一阶段:xml配置 在spring 1.x时代,使用spring开发满眼都是xml配置的bean,随着项目的扩大,我们需要把xml配置文件分放到不同的配置文件中,那时候需要频繁地在开发的类和配置文件间切换。

个人站点:javatv.net 6977

深入解析Lora SX1268:从基础配置到高级应用

本文深入解析了LoRa SX1268芯片从基础配置到高级应用的全过程。详细介绍了LoRa与FSK模式选择、核心参数(BW、SF、CR、LDRO)的配置策略、数据帧结构、缓冲区管理以及CAD模式等关键概念,旨在帮助开发者充分发挥SX1268在远距离、低功耗物联网通信中的潜力,并提供实用的调试技巧。

weixin_29168393的博客 117

Frida实战:如何用adb快速连接网易mumu模拟器进行参数Hook(附常见CPU架构问题排查)

本文详细介绍了如何使用Frida和adb快速连接网易MuMu模拟器进行参数Hook,包括环境配置、架构适配、Frida-server部署及常见问题排查。特别针对CPU架构兼容性问题提供了实用解决方案,帮助开发者高效完成逆向调试任务。

weixin_29274969的博客 289

Spring中${}的使用

在spring里面用${}是可以获得配置文件里面的值。比如你的这个里面xmlTool是在另一个配置文件里面配了的,在spring里面就可以用${xmlTool}引用进来。以后如果你要对xmlTool做修改的话,也只用修改配置文件,不用修改代码。好处就是如果你的程序要修改的时候,就只用改${}里配置文件的内容就行了,不用改spring里的配置文件的内容。 那么问题来了,spring这么知道我的配置

liufangbaishi2014的博客 6119

01_MySQL下载、安装与配置(以MySQL8.0.31版本为例)

1.点击下载好的mysql安装包 进入到mysql installer界面。2.选择MySQL Servers选项 一直下拉。

4819

Spring——${}和#{}

Spring——${}和#{} 本篇文章主要介绍一下${}和#{}的区别。首先,${}是用来时间变量插值的一种表达式。#{}是SPEL表达式。他们的作用是通过spring把值注入给某个属性。 spring的主要功能之一是依赖注入,注入的是类这种级别的,同时也是可以注入值的。 好,下面上货。 1、新建maven项目 mvn archetype:generate -D

archer的技术故事 2万+

MAX30102心率血氧传感器

估算AC、DC值的方法如下:找两个波谷点,两个波谷点之间有一个波峰点,两个波谷点相连成一条直线,与Y轴平行的线穿过波峰点会与两个波谷点连接成的直线相交于一点,这个点就是DC点,DC点的Y轴对应值就是直流分量,AC分量的值为波峰点到DC点之间的差值。在医院测量中常用的一种血氧采集方式,如下图所示,光电传感器和光源分别置于手指的两侧,光源穿过手指被另一侧的光电二极管接收,根据光衰减量计算血氧浓度。那么,根据上面的Beer-Lambert 定理,针对测量的具体场景,测量过程的衰减为三层穿透物质衰减量的叠加。

qq_41861711的博客 1万+

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8425

Spring源码:占位符${}解析源码分析

PropertyPlaceholderConfigurer PlaceholderConfigurerSupport PropertyPlaceholderHelper

博客园 2082

作物生长模型Oryza V3实战10:运行文件参数详解

运行文件(.rer)用于批量模拟农业场景,包含多组参数集(Rerunset),每组设定独立的时间范围、灌溉施肥方案等,支持测试不同农艺措施效果。该文件可实现参数自动校准,通过多组参数组合迭代寻找最优值。模拟结果文件(res.dat)会记录全部测试时间段的数据,便于用户对比产量、水分利用率等指标,筛选最优方案或分析气候适应性策略。

209

Spring表达式语言(SpEL)

Spring表达式语言(SpEL)

听海边涛声 1867

(王道计算机组成原理笔记)第一章计算机系统概述-第二节:计算机系统层次结构 1(计算机系统组成、计算机硬件)

文章目录一:冯诺依曼体系结构(1)存储程序计算机(2)层次结构二:计算机硬件概述(1)存储器A:存储元、存储单元、存储体、存储字和存储字长B:MAR 一:冯诺依曼体系结构 在冯诺依曼体系结构中,计算机的硬件主要有**存储器,运算器,控制器,输入和输出设备(也叫做I/O设备)**组成。 (1)存储程序计算机 冯诺依曼体系结构也叫做存储程序计算机,计算器和计算机的唯一区别就是计算器是不能编程的,只能做电路板中设定好的固定的运算。 这也就意味着计算器本质就是一个不能编程的计算机,其在硬件层面已经将逻辑写死,如果

快乐江湖的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring表达式语言SpEL

public static List list = Arrays.asList("矿泉水", "雪碧", "可乐", "牛奶");* 关系运算、逻辑运算和算术运算:关系运算符有lt (''), le ('='),parser.parseExpression("map['man']").setValue(rootObj,"男人");parser.parseExpression("list[1]").setValue(rootObj,"脉动");

m0_46926606的博客 1013

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深入理解 Spring 的表达式语言(SpEL)

Spring 表达式语言(SpEL)是 Spring 框架的强大工具,能在运行时灵活求值表达式。我将从它的基础语法、核心功能、应用场景等方面展开,带你深入理解 SpEL 的原理与使用。

潜意识Java的博客 1129

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

什么是Spring表达式语言(SpEL)?

Spring表达式语言(SpEL)是一个功能强大的表达式语言,支持在运行时查询和操作对象图。它的语法类似于其他表达式语言,例如EL(JSP的表达式语言),但它提供了对Spring特性的深度集成,包括方法调用、属性访问、字符串模板表达式等多种表达式类型。SpEL同时是可扩展的,并能与各种Spring项目一起工作。SpEL使用特定的语法规则,例如使用字符开始的表达式。

java永无止境! 781

Spring学习总结(四)——表达式语言 Spring Expression Language

转自:https://www.cnblogs.com/best/p/5748105.html 目录 SpEL简介与功能特性 一、为什么需要Spring表达式语言 二、SpEL表达式Hello World! 三、SpEL表达式 3.1、文字表达式 3.2、SPEL语言特性 3.2.1、属性 3.2.2、数组 3.2.3、列表 3.2.4、索引器、与字典 3.2...

weixin_34092370的博客 174

Spring 表达式语言(SpEL)

最近总想着发点什么,一直没时间 发个干货SPLE证明我还活着……佛系修仙ing Spring表达式语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言。其语法类似于统一EL,但提供了额外特性,显式方法调用和基本字符串模板函数。 同很多可用的Java 表达式语言相比,例如OGNL,MVEL和JBoss EL,SpEL的诞生是为了给Spring社区提供一个可以给Spring目录...

瑞新の博客:bennyrhys 1386

SpEL--Spring表达式语言

前言 SpEL(Spring Expression Language),即Spring表达式语言。它是一种类似JSP的EL表达式、但又比后者更为强大有用的表达式语言。 为什么要用SpEL:因为它可以在spring容器内实时查询和操作数据,尤其是操作List列表型、Array数组型数据。所以使用SpEL可以有效缩减代码量,优化代码结构,笔者认为很有用。 一. 用法 常规SpEL有三种用法: 在注解@Value中使用 在XML配置中使用 在代码中创建Expression对象...

Meiko记录 688

Spring表达式语言:SpEL

简介 Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为SpEL。SpEL为bean属性的动态赋值提供了便利。 通过 SpEL 可以实现: 通过 bean 的 id 对 bean 进行引用 调用方法以及引用对象中的属性 计算表达式的值 正则表达式的匹配 1.字面量的赋值 <!...

qq_43687990的博客 1011

使用Spring表达式语言进行装配

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33713707的博客 93

Spring表达式语言使用

Spring表达式语言使用@(Spring)[spEL, Spring, 表达式语言]Spring表达式语言使用 基本概述 spEL的功能概述 spEL语法以XML为例 字面值表达式 字符串 整型 浮点型 科学计数法 boolean类型 引用Bean属性和方法 引用其它对象 引用其他对象的属性 调用其他方法 调用静态方法 SpEL 支持的运算符号 算数运算符 - 比较运算符 lt

Switch的博客 4085
上一篇: 如何学习java
下一篇: Java开发Dubbo分布式框架使用及原理浅析
HelloWorld_AA
博客等级 码龄9年 18粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值