首先先简单描述一下SpEl的概念:
Spring表达式语言: SpEL
Spring表达式语言(简称SpEL) : 是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于EL : SpEL使用+#(…}作为定界符,所有在大 框号中的字符都将被认为是SpEL
● SpEL为bean的属性进行动态赋值提供了便利
● 通过SpEL可以实现 :
- 通过bean的id对bean进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
运算符类型 | 运算符 |
---|---|
算术运算 | +、-、*、/、%、^ |
比较运算 | 符号形式:<、>、==、<=、>= 文本形式:lt、gt、eq、le、ge |
逻辑运算 | and、or、not |
条件运算 | ?: (ternary)、?: (Elvis) |
正则表达式 | matches |
1.1 算数运算:( + , - , * , / )
<bean id="spEl" class="cn.itcast.spring.beans.SpEl.doamin.TestSpEl">
<!-- +号运算符 -->
<property name="add_res" value="#{100 + 100}"/>
<!-- -号运算符 -->
<property name="sub_res" value="#{100 - 50}"/>
<!-- *号运算符 -->
<property name="mul_res" value="#{10 * 10}"/>
<!-- /号运算符 -->
<property name="div_res" value="#{100 / 10}"/>
</bean>
输出结果:
add_res = 200,
sub_res = 50,
mul_res = 100,
div_res = 10.0
1.2 比较运算:( > , < , >= , <= , == )
<!-- > 号运算符 -->
<property name="big_res" value="#{100 > 10}"/>
<!-- < 号运算符 -->
<property name="sml_res" value="#{100 lt 10}"/>
<!-- >= 号运算符 -->
<property name="big_eql_res" value="#{100 >= 100}"/>
<!-- <= 号运算符 -->
<property name="sml_eql_res" value="#{100 le 100}"/>
<!-- = 号运算符 -->
<property name="eql_res" value="#{100 == 100}"/>
注意:XML文件中不允许定义 ’ < 号’ 因为它是敏感标签, 所以应该我们可以使用lt 标签代替 ‘<’ 号,从而达到演示效果
这里小编补充一些解释:
eq: EQUAL 等于
ne :NOT EQUAL 不等于
gt :GREATER THAN 大于
lt :LESS THAN 小于
ge:GREATER THAN OR EQUAL 大于等于
le: LESS THAN OR EQUAL 小于等于
输出结果:
big_res = true,
sml_res = false,
big_eql_res = true,
sml_eql_res = true,
eql_res = true
1.3逻辑运算:(and , or , not )
<!-- and 运算符 -->
<property name="and_res" value="#{(10 == 10) and (100 == 10)}"/>
<!-- or 号运算符 -->
<property name="or_res" value="#{(100 == 100) or (100 = 10)}"/>
<!-- not 号运算符 -->
<property name="not_res" value="#{ not (100 == 10)}"/>
输出结果:
and_res = false,
or_res = true,
not_res = true
1.4 条件运算:
1.4.1 首先先创建两个CarBean
<bean id="car" class="cn.itcast.spring.beans.domain.Car">
<property name="brand" value="Audi"/>
<property name="addr" value="BeiJ"/>
<property name="price" value="200000"/>
</bean>
<bean id="car2" class="cn.itcast.spring.beans.domain.Car">
<property name="brand" value="NoJi"/>
<property name="addr" value="ChangS"/>
<property name="price" value="300000"/>
</bean>
1.4.2 条件表达式
//这里使用#{ user.car.price > 100000 ? car2 : car} 条件表达式
<bean id="user3" class="cn.itcast.spring.beans.domain.User_Caffr" parent="user">
<property name="car" value="#{ user.car.price > 100000 ? car2 : car}"/>
</bean>
1.5 正则表达式:(matches )
<!-- 正则表达式 -->
<property name="mat_res" value="#{10 matches '[0-100]*'}"/>
输出结果:
mat_res=true
1.6 其他
<!-- 整数 -->
<property name="count" value="#{5}"/>
<!-- -科学计数法: -->
<property name="capacity" value="#{1e4]"/>
<!-- 布尔 -->
<property name="enabled" value="#{false}"/>
2.1 引用对象类型属性
<bean id="user" class="cn.itcast.spring.beans.domain.User_Caffr">
<property name="user_name" value="ZS"/>
</bean>
<bean id="user2" class="cn.itcast.spring.beans.domain.User_Caffr">
<property name="user_name" value="#{user.user_name}"/>
</bean>
2.2 关于集合数组的操作
2.2.1 准备工作:创建User类
private String name;//姓名
private String sex;//性别
private int age;//年龄
2.2.2 创建ArrayAndListBean类
private String[] bags;//包中文具名
private int[] ball;//球的个数数组
private List<String> pome;//诗句集合
private User[] users;//用户数组
2.2.3 创建userBean
<bean id="user" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Rocy"/>
<constructor-arg value="male"/>
<constructor-arg value="23"/>
</bean>
<bean id="user2" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Jack"/>
<constructor-arg value="male"/>
<constructor-arg value="24"/>
</bean>
<bean id="user3" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Rose"/>
<constructor-arg value="female"/>
<constructor-arg value="24"/>
2.2.4 创建ArrayAndListBean
<bean id="arrayAndListBean" class="cn.itcast.spring.beans.SpEl.doamin.ArrayAndListBean">
<property name="bags">
<array>
<value>文具盒</value>
<value>铅笔盒</value>
<value>眼镜盒</value>
<value>橡皮擦</value>
</array>
</property>
<property name="ball">
<array>
<value>1</value>
<value>3</value>
<value>5</value>
<value>7</value>
<value>9</value>
</array>
</property>
<property name="pome">
<list>
<value>床前明月光</value>
<value>疑是地上霜</value>
<value>举头望明月</value>
<value>低头思故乡</value>
</list>
</property>
<property name="users">
<array>
<ref bean="user"/>
<ref bean="user2"/>
<ref bean="user3"/>
</array>
</property>
</bean>
输出结果:
ArrayAndListBean{
bags=[文具盒, 铅笔盒, 眼镜盒, 橡皮擦],
ball=[1, 3, 5, 7, 9],
pome=[床前明月光, 疑是地上霜, 举头望明月, 低头思故乡],
users=[User{name=‘Jack’, sex=‘male’, age=24},
User{name=‘Rocy’, sex=‘male’, age=23}]}
2.2.5 创建TestArrayAndList测试类
private String bag;//接受文具名称
private int ball;//接受球的数量
private String pome;//接受诗句
private List<User> get_age_user;//接受返回集合Uer
private User user_fir;//接受第一个匹配项
private User user_last;//接受最后一个匹配项
private List<String> get_all_name;//接受所有的名字
2.2.6 完成如下需求:
1.从bags数组中获取橡皮擦
<!--
1.从bags数组中获取橡皮擦 arrayAndListBean 引用上面ArrayAndListBean 获取其中的bags属性
-->
<property name="bag" value="#{arrayAndListBean.bags[3]}"/>
输出结果:bag=‘橡皮擦’
2.获取ball中的‘5’
<!--
2.获取ball中的‘5’ 引用上面ArrayAndListBean 获取其中的ball属性
-->
<property name="ball" value="#{arrayAndListBean.ball[2]}"/>
输出结果:ball=5
3.获取pome中的‘举头望明月’
<!--
3.获取pome中的‘举头望明月’ 引用上面ArrayAndListBean 获取其中的pome属性
-->
<property name="pome" value="#{arrayAndListBean.pome.get(2)}"/>
输出结果:pome=‘举头望明月’
4 .获取年龄24的所有User信息
.?[表达式] 运算符:用来对集合进行过滤,得到集合的一个子集
<!--
4.获取年龄24的所有User信息
-->
<property name="get_age_user" value="#{(arrayAndListBean.users).?[age == 24]}"/>
输出结果:get_age_user=[User{name=‘Jack’, sex=‘male’, age=24}, User{name=‘Rose’, sex=‘female’, age=24}]
5获取查询满足表达式的第一个匹配项,如:获取第一个年龄为24岁的User
.^ [表达式]:查询满足表达式的第一个匹配项
<!--
5获取查询满足表达式的第一个匹配项,如:获取第一个年龄为24岁的User
-->
<property name="user_fir" value="#{(arrayAndListBean.users).^[age == 24]}"/>
输出结果: user_fir=User{name=‘Jack’, sex=‘male’, age=24}
6.获取查询满足表达式的最后一个匹配项,如:获取最后一个年龄为24岁的User
.$[表达式]:查询满足表达式的最后一个匹配项
<!--
6.获取查询满足表达式的最后一个匹配项,如:获取最后一个年龄为24岁的User
-->
<property name="user_last" value="#{(arrayAndListBean.users).$[age == 24]}"/>
输出结果:user_last=User{name=‘Rose’, sex=‘female’, age=24}
7.查询所有User的名字
.![属性名]:从集合的每个成员中选择特定的属性放到另外一个集合中
<!--
7.查询所有User的名字
-->
<property name="get_all_name" value="#{(arrayAndListBean.users).![name]}"/>
输出结果:get_all_name=[Jack, Rocy, Rose]
2.3 使用T()调用一个类的静态方法
<property name="c" value="#{T(java.lang.Math).PI * 2 }"/>
好了 , 以上就是小编总结的SpEl表达式的用法总结了,如果有什么说错的地方欢迎大家指正,共同学习!