Spring使用SpEL表达式装配Bean
来源:互联网 发布:网络销售盈利模式 编辑:程序博客网 时间:2024/04/29 10:54
Spring使用SpEL表达式装配Bean
SpEL的基本原理
SpEL表达式的首要目标是通过计算获得某个值。在计算这个数值的过程中,会使用到其他的值并会对这些值进行操作。最简单的SpEL求值是对字面值、Bean的属性或者某个类的常量进行求值。
字面值
我们可以在元素value属性中使用#{}界定符把值装配到Bean的属性中,如下
<bean id="XX" class="com.janmee.Test"> <property name="count" value="#{5}" /> <property name="frequency" value="#{89.4}" /> <property name="capacity" value="#{1e4}" /> <property name="name" value="#{'Chuck'}" /> <property name="enable" value="#{false}" /></bean>
引用Bean、Properties和方法
<bean id="yy" class="com.janmee.YY" /><bean id="xx" class="com.janmee.XX"> <property name="instrument" value="#{yy}" /></bean>
使用Bean的引用来获得Bean的属性、方法
<bean id="yy" class="com.janmee.YY"> <property name="song" value="Jingle Bells" /> <property name="instrument"> <bean class="com.janmee.Saxophone" /> </property></bean>属性:<bean id="xx" class="com.janmee.XX"> <property name="song" value="#{yy.song}" /></bean>方法:<bean id="xx" class="com.janmee.XX"> <property name="song" value="#{yy.getSong()}" /></bean><bean id="xx" class="com.janmee.XX"> <property name="song" value="#{yy.getSong().toUpperCase()}" /></bean>在SpEL中避免抛出讨厌的空指针异常(NullPointerException)的方法是使用null-safe存取器?.在右边方法之前,该运算符会确保左边项的值不会为null<property name="song" value="#{yy.getSong()?.toUpperCase()}" />
操作类
在SpEL中,使用T()运算符会调用类作用域的方法和常量。例如,在SpEL中使用Java的Math类,我们可以像下面的示例这样使用T()运算符:T(java.lang.Math)
<property name="multiplier" value="#{T(java.lang.Math).PI}" /><property name="randomNumber" value="#{T(java.lang.Math).random()}" />
在SpEL值上执行操作
SpEL提供了几种运算符,这些运算符可以用在SpEL表达式中的值上
- 算数运算:+、-、*、/、&、^
- 关系运算:<> == <= >= lt gt eq le ge
- 逻辑运算:and or not |
- 条件运算:?:
- 正则表达式:matches
当处理文本时,检查文本是否匹配某种模式有时是非常有用的。SpEL通过matches运算符支持表达式中的模式匹配。如判断一个字符串是否为有效的邮件地址。
<property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com'}" />
在SpEL中筛选集合
SpEL可以引用集合中的某个成员,就像在Java里操作一样。但是SpEL同样具有基于属性值来过滤集合成员的能力。SpEL还可以从集合的成员中提取某些属性放到一个新的集合中。如:
<util:list id="cities"> <bean class="com.habuma.spel.cities.City" p:name="Chicago" p:population="28374498" /> <bean class="com.habuma.spel.cities.City" p:name="Atlanta" p:population="28374498"/> <bean class="com.habuma.spel.cities.City" p:name="Dallas" p:population="28374498"/> <bean class="com.habuma.spel.cities.City" p:name="Hoston" p:population="28374498"/></util:list><property name="chosenCity" value="#{cities[2]}" /> <!--下标从0开始-->
[]运算符同样可以用来获取java.util.Map集合中的成员。如,假设City对象以其名字作为键放入Map集合中。在这种情况下,可以使用
<property name="chosenCity" value="#{cities['Chicago']}"、>
[]运算符的另一种用法是从java.until.Properties集合中获取值。假设我们需要通过元素在Spring中加载一个properties配置文件,如下
<util:properties id="settings" location="classpath:settings.properties" />
通过SpEl从settings Bean中访问一个名为twitter.accessToken的属性,如下:
<property name="accessToken" value="#{settings['twitter.accessToken']}"/>
另外Spring还为SpEL创造了两种特殊的选择属性方式:systemEnvironment和systemProperties.
systemEnvironment包含了应用程序所在机器上的所有环境变量。
systemProperties包含了java应用程序启动时所设置的所有属性。
<property name="homePath" value="#{systemEnvironment['HOME']}"/>
查询集合成员
如果从城市集合中查询人口多余100000的城市,一种实现方式是将所有的cities Bean都装配到Bean的属性中,然后再该Bean中增加过滤不符合条件的城市的逻辑。但是在SpEL中,只需使用一个查询运算符(.?[])就可以简单做到,如下:
<property name="bigCities" value="#{cities.?[population gt 100000]}" />
其他两种查询运算符:.^[]和.$[],分别是查询第一个匹配项和最后一个匹配项
投影集合
集合投影是从集合的每一个成员中选择特定的属性放入一个新的集合。SpEL的投影运算符(.![])
假设仅需要包含城市名称的一个String类型的集合,而不是City对象的集合。
<property name="cityNames" value="#{cities.![name]}" />
- Spring使用SpEL表达式装配Bean
- Spring:spring表达式-SPEL , 使用表达式装配bean属性。
- 使用SpEL表达式装配Bean
- Spring 使用表达式进行装配 SpEL表达式
- [Spring实战系列](11)SpEL使用表达式装配
- Spring3.x--使用SpEL表达式装配
- spring ioc容器注入的集中方式,以及属性注入的集中依赖,继承,使用SPEL表达式,ioc容器的生命周期,bean的几种工厂方法配置方式,bean的自动装配
- 深入学习Spring框架之七SpEL表达式装配
- 使用spring进行bean装配
- Spring 使用注解装配Bean
- Spring 配置使用 - 装配 Bean
- (笔记)Spring实战_装配Bean(3)_使用表达式装配
- Spring-Bean配置-SpEL
- spring4-2-bean配置-7-Spring表达式语言SpEL
- Spring的SpEL表达式标准简单使用
- Spring Cache抽象-使用SpEL表达式
- Spring Security3 SpEL表达式
- Spring SpEL表达式
- iOS获取手机型号
- 转场不销毁物体 esc退出,Canvas Group组,blocks Raycasts
- 五大黄金法则祝你快速升职
- python的easy_install安装指南
- android 绕过R文件,通过代码获取styleable的属性
- Spring使用SpEL表达式装配Bean
- iOS property属性
- 象棋残局算法分析
- ORACLE SEQUENCE
- 6中最常用恒流源电路的分析与比较
- Unity3D系列2:Input.GetButtonDown没有正确响应
- iOS提交应用至APP Store流程
- C++从1~m数字中任取k个元素,求所有组合算法
- Java位运算的使用场景