Spring表达式语言

Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。使用SpEL,你可以实现超乎想象的装配效果,这是使用其他的装配技术难以做到的(甚至是不可能的)。

SpEL拥有很多特性:

  • 使用bean的ID来引用bean;

  • 调用方法和访问对象的属性;

  • 对值进行算术、关系和逻辑运算;

  • 正则表达式匹配;

  • 集合操作。

  • SpEL表达式要放到“#{ ... }”之中,这与属性占位符有些类似,属性占位符需要放到“${ ... }”之中。

#{1}  //1
#{T(System).currentTimeMillis()} // 最终结果是计算表达式的那一刻当前时间的毫秒数

除去“#{ ... }”标记之后,剩下的就是SpEL表达式体了,T()表达式 会将java.lang.System视为Java中对应的类型,因此可以调用其static修饰的currentTimeMillis()方法。

  • SpEL表达式也可以引用其他的bean或其他bean的属性。例如,如下的表达式会计算得到ID为sgtPeppers的bean的artist属性:
#{sgtPeppers.artist}
  • 我们还可以通过systemProperties对象引用系统属性:
#{systemProperties['url']}  //获取属性文件的 url 属性

举例:

  @Bean("myComponentName03")
    public CDPlayer  cd(@Value("#{systemProperties['url']}") url,@Value("#{systemProperties['username']}") username,@Value("#{systemProperties['password']}") password) {
        return new DataSource(url,username,password));
    }
<bean id="customerDAO" class="com.sanxin.org.jdbc.JdbcCustomerDAO" 
  c:_url =  "#{systemProperties['url']}"  c:_username = "#{systemProperties['username']}" 
  c:_password = "#{systemProperties['password']}"/>

SpEL用法规则

  • 浮点值:
#{3.141592654}
  • 科学记数法的方式进行表示:
#{9.87E4}  // 98700
  • String类型的字面值:
#{"hello"}
  • Boolean类型的值:
#{false}
  • 引用bean、属性和方法:
#{sgtPeppers} //通过id引用bean
#{sgtPeppers.artist} //通过id引用bean的属性
#{sgtPeppers.selectArtist()} //通过id引用bean的方法

为了避免出现NullPointerException,我们可以使用类型安全的运算符来操作表达式的内容:

#{sgtPeppers.selectArtist()?.toUpperCase()} //如果selectArtist()的返回值是null的话,那么SpEL将不会调用toUpperCase()方法。表达式的返回值会是null。
  • 在表达式中使用类型:
    如果要在SpEL中访问类作用域的方法和常量(即static关键字修饰的方法或属性)的话,要依赖T()这个关键的运算符。
T(java.lang.Math).PI //这里所示的T()运算符的结果会是一个Class对象,代表了java.lang.Math。得到PI值
T(java.lang.Math).random() //得到一个0到1之间的随机数
  • SpEL运算符:
  • 算术运算: + 、 - 、 * 、 / 、 % 、 ^
  • 比较运算: < 、 > 、 == 、 <= 、 >= 、 lt 、 gt 、 eq 、 le 、 ge
  • 逻辑运算:and 、 or 、 not 、 |
  • 条件运算:?: (ternary) 、 ?: (Elvis)
  • 正则表达式:matches

当使用String类型的值时,“+”运算符执行的是连接操作,与在Java中是一样的:

#{'我时一个' + sgtPeppers.artist}

要比较两个数字是不是相等,可以使用双等号运算符(==)

#{count.sum == 100} //返回 true 或是 false
#{count.sum eq100} //也可以使用文本型的 eq 运算符

三元运算符,它与Java中的三元运算符非常类似。三元运算符的一个常见场景就是检查null值,并用一个默认值来替代null。例如:

#{user.name ? user.name  :'guest'} // 如果是null的话,那么表达式的计算结果就会是“Rattleand Hum”
  • 计算正则表达式
#{user.phone matches '[正则表达式]'}  //返回true or false
  • 计算集合
#{user.cart[4].goodName} // cart时ID为user的bean中的一个集合,goodName是cart集合中对象的属性

“[]”运算符用来从集合或数组中按照索引获取元素,实际上,它还可以从String中获取一个字符。比如:

#{'hello'[1]} //e
  • 查询运算符(.?[]),它会用来对集合进行过滤,得到集合的一个子集。
#{user.cart.?[goodName eq '超炫酷']}  //挑选出ID为user的bean中cart集合中对象属性goodName为超炫酷的对象。
  • SpEL还提供了另外两个查询运算符:(.^[])和(.$[]),它们分别用来在集合中查询第一个匹配项和最后一个匹配项。

  • SpEL还提供了投影运算符(.![]),它会从集合的每个成员中选择特定的属性放到另外一个集合中。假设我们不想要歌曲对象的集合,而是所有歌曲名称的集合,就可以使用投影运算符。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容