在Spring XML配置文件中装配Bean的属性和构造参数都是静态的,而在运行期才知道装配的值,就可以使用SpEL实现
        SpEL表达式的首要目标是通过计算获得某个值。在计算这个数值的过程中,会使用到其他的值并会对这些值进行操作。
        SpEL特性:(1)、使用Bean的ID来引用Bean;(2)、调用方法和访问对象的属性;(3)、对值进行算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作
        #{ }标记会提示 Spring这个标记里的内容是SpEL表达式。
        最简单的属性注入:<property name="count" value="#{5}" />
        还可以与非SpEL表达式的值混用:<property name="message" value="The value is #{5}" />
        浮点数value="#{89.7}"        科学记数法value="#{1e4}"=====>10000.0
        String类型的字面值:<property name="name" value="#{'Tom'}" />或<property name="name" value='#{"Tom"}' />    单引号和双引号相互包含的方式使用
        布尔类型:<property name="enable" value="#{false}" />
        引用Bean:<property name="userDao" value="#{userDao}" />等价于<property name="userDao" ref="userDao" />
        引用Bean属性:<property name="orderOwner" value="#{user.name}" />类似代码:User user=new User();order.setOrderOwner(user.getName());
        引用Bean的方法:<property name="currUser" value="#{userDao.getCurrUser()}" />(假设userDao内有公共方法getCurrUser())
                现在如果想把userDao.getCurrUser()得到的当前英文用户名转为大写字母:<property name="currUser" value="#{userDao.getCurrUser().toUpperCase()}" />,这时如果得到的用户名为空(null),则会抛NullPointerException异常,为了避免异常,可以使用?.代替点(.),如:<property name="currUser" value="#{userDao.getCurrUser()?.toUpperCase()}" />这样null后面的方法不再执行
        SpEL表达式中使用T( )运算符访问指定类的静态方法和常量。
                如引用Math类的PI常量:<property name="pi" value="#{T(java.lang.Math).PI}" />
                如调用Math类的random静态方法:<property name="randomNumber" value="#{T(java.lang.Math).random()}" />
        使用SpEL进行数值运算:
                加法:<property name="adjustedAmount" value="#{counter.total+42}" />(把counter Bean的total属性值与42相加,注意+运算符两边必须是数字型)
                其他减、乘、整除、求余运算符类似。
               使用SpEL进行比较和逻辑表达式运算时,会将得到的布尔型(true或false)赋值给属性,注意,比较运算符的<、<=、>、>=这些符号含有<、>,在XML中有特殊意义,故使用中需要用文本替代方式。==对应eq、<对应lt、<=对应le、>对应gt、>=对应ge
                比较运算符:<property name="equal" value="#{counter.total==100}" />
                逻辑表达式(and 、or 、not或!):<property name="largeCircle" value="#{shape.kind=='circle' and shape.perimeter gt 10000}" />
                条件表达式(使用三元运算符? : ):<property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}" />
                上述条件表达式中kenny.song有重复,可以简化写:<property name="song" value="#{kenny.song ? : 'Greensleeves'}" />
                 正则表达式:<property name="validEmail" value="#{admin.email matches '/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/'}" />
        在SpEL中筛选集合
                假设有个City类,属性有name、state、population
                在Spring XML中引入util命名空间,定义一个<util:list>集合
                
<util:list id="cities">
<bean class="cn.hjp.norClass.City">
<property name="name" value="Chicago"></property>
<property name="state" value="IL"></property>
<property name="population" value="2853114"></property>
</bean>
<bean class="cn.hjp.norClass.City">
<property name="name" value="Atlanta"></property>
<property name="state" value="GA"></property>
<property name="population" value="537958"></property>
</bean>
<bean class="cn.hjp.norClass.City">
<property name="name" value="Dallas"></property>
<property name="state" value="TX"></property>
<property name="population" value="1279910"></property>
</bean>
<bean class="cn.hjp.norClass.City">
<property name="name" value="Houston"></property>
<property name="state" value="TX"></property>
<property name="population" value="2242193"></property>
</bean>
<bean class="cn.hjp.norClass.City">
<property name="name" value="Jal"></property>
<property name="state" value="NM"></property>
<property name="population" value="1996"></property>
</bean>
</util:list>
                访问集合成员:<property name="chosenCity" value="#{cities[2]}" /> 选出集合中第三个City               
                                         <property name="chosenCity" value="#{cities[T(java.lang.Math).random()*cities.size()]}" />结合SpEL表达式其他方法
                []运算符也可以获取java.util.Map集合中成员,假设City是Map集合:<property name="chosenCity" value="#{cities['Dallas']}" />
        从java.util.Properties集合中取值,通过<util:properties>元素加载properties配置文件,假设文件有内容twitter.accessToken=aadkeudnfsje233sdjfs。获取方式:<property name="chosenCity" value="#{settings['twitter.accessToken']}" />
        Spring还为SpEL创造了两种特殊的选择属性方式:systemEnvironment和systemProperties
                systemEnvironment包含了应用程序所在机器上的所有环境变量(其实是一个java.util.Properties集合),如获取JAVA_HOME路径:<property name="homePath" value="#{systemEnvironment['JAVA_HOME']}" />
                systemProperties包含了java应用程序启动时所设置的所有属性(通常通用-D参数)。因此。如果使用-Dapplication.home=/etc/myapp,来启动JVM,那么通过SpEL获取:<property name="homePath" value="#{systemProperties['application.home']}" />
        使用SpEL获取字符串某字符:'This is a test'[3]
        查询集合成员:
                <property name="bigCities" value="#{cities.?[population gt 100000]}" />得到人口大于100000的城市集合
                <property name="aBigCities" value="#{cities.^[population gt 100000]}" />得到人口大于100000的第一个符合条件的大城市
                <property name="bigCities" value="#{cities.$[population gt 100000]}" />得到人口大于100000的最后一个符合条件的大城市
        投影集合:从集合中选取每个成员的属性放入一个新的集合中,使用.![]运算符
                <property name="cityNames" value="#{cities.![name]}" /> 得到城市的名字并赋予String类型集合
                <property name="cityNames" value="#{cities.![name + ', '  + state]}" />属性拼接,得到如"Chicago,IL"、"Atlanta,GA"、等数据集合
 
注意:在传统方式难以实现的情况下可以考虑使用SpEL,不要把过多逻辑放入SpEL表达式中
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Spring实战学习笔记之SpEL表达式的更多相关文章

  1. spring实战学习笔记(一)spring装配bean

    最近在学习spring boot 发现对某些注解不是很深入的了解.看技术书给出的实例 会很疑惑为什么要用这个注解? 这个注解的作用?有其他相同作用的注解吗?这个注解的运行机制是什么?等等 spring ...

  2. Spring 实战 学习笔记(1)

    Spring的核心 依赖注入 & 切面编程 1.创建应用组件之间协作的行为通常称为装配.(wiring) 2.Spring EL表达式.SEL是一种能在运行时构建复杂表达式,存取对象属性.对象 ...

  3. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  4. Spring.NET学习笔记——目录(原)

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  5. Spring实战读书笔记

    Spring实战读书笔记 Spring-core Spring之旅 - DI 和 AOP 概念 spring 的Bean容器 spring 的 核心模块 Spring的核心策略 POJO 最小侵入式编 ...

  6. java学习笔记06--正则表达式

    java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...

  7. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  8. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  9. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

随机推荐

  1. Jenkins + NuGet + MSBuild

    Jenkins + NuGet + MSBuild 背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西 ...

  2. [转]World Wind Java开发之四——搭建本地WMS服务器

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...

  3. Andorid-15k+的面试题。

    andorid开发也做了3年有余了,也面试很多加企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助. 特别献上整理过的50道面试题目 1. ...

  4. 自定义GrildView实现单选功能

    首先看实现功能截图,这是一个自定义Dialog,并且里面内容由GrildView 绑定数据源,实现类似单选功能. 首先自定义Dialog,绑定数据源 自定义Dialog弹出框大小方法 最主要实现的就是 ...

  5. 20135220谈愈敏Blog8_进程的切换和系统的一般执行过程

    进程的切换和系统的一般执行过程 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-100002 ...

  6. 20135316王剑桥 linux第五周课实验笔记

    4.1.1程序员的可见的状态 ———— Y86的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态.如图1所示. 1.程序寄存器(Program registers): %eax, %ec ...

  7. IOS开发之—— 上传头像的使用

    static NSString *const uploadSuccess = @"更改头像成功"; @interface DMAccountInformationViewContr ...

  8. 同步git修改文件到远端服务器脚本

    #!/usr/bin/perl -w @files=`git status -s` ; @sync_files = (); foreach (@files) { ); # 固定前2个字符为状态 + 1 ...

  9. 一个简单js select插件

    现在,通过一个select插件,来介绍一下js插件的构建过程. 1.先上效果图 2.目录构建 (1)这个select插件,我给它起名交hongselect,所以呢,首先建个hongselect的文件夹 ...

  10. 微信小程序开发常见问题分析

    距离微信小程序内测版发布已经有十几天的时间了,网上对微信小程序的讨论也异常火爆,从发布到现在微信小程序一直占领着各种技术论坛的头条,当然各种平台也对微信小程序有新闻报道,毕竟腾讯在国内影响力还是很大的 ...