• 概述
  • SpEL:字面量
  • SpEL:引用 Bean、属性和方法
    • 引用其他对象
    • 引用其他对象的属性
    • 调用其他方法,还可以链式操作
    • 调用静态方法或静态属性
  • SpEL支持的运算符号
    • 算数运算符:+, -, *, /, %, ^
    • 加号还可以用作字符串连接
    • 比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge
    • 逻辑运算符号: and, or, not, |
    • if-else 运算符:?: (ternary), ?: (Elvis)
    • if-else 的变体
    • 正则表达式:matches
  • 示例-基于xml的方式
    • 示例-基于注解的方式

概述

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。


语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL


SpEL 为 bean 的属性进行动态赋值提供了便利.

通过 SpEL 可以实现:

  • 通过 bean 的 id 对 bean 进行引用

  • 调用方法以及引用对象中的属性

  • 计算表达式的值

  • 正则表达式的匹配


SpEL:字面量

字面量的表示:

整数:
<property name="count" value="#{5}"/>小数:
<property name="frequency" value="#{89.7}"/>科学计数法:
<property name="capacity" value="#{1e4}"/>String可以使用单引号或者双引号作为字符串的定界符号:
<property name=“name” value="#{'Chuck'}"/>
或
<property name='name' value='#{"Chuck"}'/>Boolean:
<property name="enabled" value="#{false}"/>

如果仅仅是表示字面量,其实是没有必要使用Spring EL表达式的,这里仅仅演示一下而已,日常的开发中很少使用。


SpEL:引用 Bean、属性和方法

引用其他对象

但是我们更常用ref 来实现其他对象的引用


引用其他对象的属性


调用其他方法,还可以链式操作


调用静态方法或静态属性

通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:


SpEL支持的运算符号

算数运算符:+, -, *, /, %, ^


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


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


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


if-else 运算符:?: (ternary), ?: (Elvis)


if-else 的变体


正则表达式:matches


示例-基于xml的方式

package com.xgj.spel;/*** * * @ClassName: Address* * @Description: 地址信息* * @author: Mr.Yang* * @date: 2018年4月7日 下午8:29:12*/
public class Address {private String city;private String street;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}@Overridepublic String toString() {return "Address [city=" + city + ", street=" + street + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";}}
package com.xgj.spel;/*** * * @ClassName: Car* * @Description: 车辆* * @author: Mr.Yang* * @date: 2018年4月7日 下午8:30:01*/
public class Car {private String brand;private double price;// 调用静态方法或静态属性:通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性private long weight;public long getWeight() {return weight;}public void setWeight(long weight) {this.weight = weight;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Car [brand=" + brand + ", price=" + price + ", weight=" + weight + "]";}}
package com.xgj.spel;public class Boss {private String name;private Car car;// 通过 Spring El 引用 Address的cityprivate String city;// 通过 Car的price属性,确定info ,如果car.price>=500000 ,info 为CEO,否则为 Staffprivate String info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}@Overridepublic String toString() {return "Boss [name=" + name + ", car=" + car + ", city=" + city + ", info=" + info + "]";}}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="car" class="com.xgj.spel.Car" p:brand="Bench" p:price="700000"p:weight="#{T(java.lang.Math).PI * 4567}" /><!-- 通过Spring El表达式为属性赋值一个字面值 ,当然了,如果是字面值就没有必要使用Spring El表达式了,这里仅仅是演示该用法 --><bean id="address" class="com.xgj.spel.Address" p:city="#{'NanJing'}"p:street="RuanJianDaDao" /><bean id="boss" class="com.xgj.spel.Boss" p:name="Artisan" p:city="#{address.city}"p:car-ref="car"p:info="#{car.price > 500000 ? 'CEO' : 'staff'}" /></beans>

测试类:

package com.xgj.spel;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpelTest {public static void main(String[] args) {String configLocation = "com/xgj/spel/beans_spel.xml";ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);Car car = (Car) ctx.getBean("car");System.out.println(car);Boss boss = (Boss) ctx.getBean("boss");System.out.println(boss);}}

结果:

2018-04-07 21:21:30,804  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4af6178d: startup date [Sat Apr 07 21:21:30 BOT 2018]; root of context hierarchy
2018-04-07 21:21:30,907  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/spel/beans_spel.xml]
Car [brand=Bench, price=700000.0, weight=14347]
Boss [name=Artisan, car=Car [brand=Bench, price=700000.0, weight=14347], city=NanJing, info=CEO]

示例-基于注解的方式

我们通过一个数据库的例子来演示。虽然可以通过Spring El 表达式从配置文件中加载一个参数值,比如

@Value("#{properties['jdbc.driverClassName']}")

是不是容易出错…. Spring提供了更好的方式 context:property-placeholder。

package com.xgj.spel.annotation;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** * * @ClassName: MyDataSource* * @Description: 数据源 @Component标注* * @author: Mr.Yang* * @date: 2018年4月7日 下午9:26:32*/@Component
public class MyDataSource {private String driverClass;private String url;private String username;private String password;public String getDriverClass() {return driverClass;}/*** * * @Title: setDriverClass* * @Description: @Value注解自动注入属性配置文件中对应属性的值* * @param driverClass* * @return: void*/@Value("${jdbc.driverClassName}")public void setDriverClass(String driverClass) {this.driverClass = driverClass;}public String getUrl() {return url;}@Value("${jdbc.url}")public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}// @Value("$(jdbc.username)")@Value("${jdbc.username}")public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}@Value("${jdbc.password}")public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "MyDataSource [driverClass=" + driverClass + ", url=" + url + ", username=" + username + ", password=" + password + "]";}}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 扫描的基包 --><context:component-scan base-package="com.xgj.spel.annotation"/><!-- 加载外部properties文件 --><context:property-placeholder location="classpath:mysql/db_mysql.properties"/>  </beans>

db_mysql.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/artisan
jdbc.username=artisan
jdbc.password=artisan
package com.xgj.spel.annotation;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestCase {@Testpublic void test() {String configurationLocation = "com/xgj/spel/annotation/beans_anno.xml";ApplicationContext ctx = new ClassPathXmlApplicationContext(configurationLocation);MyDataSource myDataSource = (MyDataSource) ctx.getBean("myDataSource");System.out.println(myDataSource);System.out.println("driverClassName:" + myDataSource.getDriverClass());System.out.println("url:" + myDataSource.getUrl());System.out.println("username:" + myDataSource.getUsername());System.out.println("password:" + myDataSource.getPassword());}}

运行结果

2018-04-07 23:37:11,409  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@761df304: startup date [Sat Apr 07 23:37:11 BOT 2018]; root of context hierarchy
2018-04-07 23:37:11,552  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/spel/annotation/beans_anno.xml]
MyDataSource [driverClass=com.mysql.jdbc.Driver, url=jdbc:mysql://localhost:3306/artisan, username=artisan, password=artisan]
driverClassName:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/artisan
username:artisan
password:artisan

Sping-Spring表达式语言SpEL相关推荐

  1. sple表达式_学习Spring表达式语言(SpEL)

    概观 Spring Expression Language(缩写为SpEL)是一种强大的表达式语言.在Spring产品组合中,它是表达式计算的基础.它支持在运行时查询和操作对象图,它可以与基于XML和 ...

  2. 开涛spring3(5.15.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础

    5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...

  3. Spring 表达式语言(SpEL)

    本文纯属spring官方文档翻译版,详情请参考:Core Technologies Spring 表达式语言(简称"SpEL"),Spring Expression Languag ...

  4. Spring表达式语言使用

    Spring表达式语言使用 @(Spring)[spEL, Spring, 表达式语言] Spring表达式语言使用 基本概述 spEL的功能概述 spEL语法以XML为例 字面值表达式 字符串 整型 ...

  5. Spring3 表达式语言(SpEL)介绍

    http://leeyee.github.io/blog/2011/06/19/spring-expression-language/ Spring Expression Language (SpEL ...

  6. SpringEL 表达式语言(Spring Expression Language)

    Spring学习总结:表达式语言 Spring Expression Language 目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! ...

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

    SpEL简介与功能特性 Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言.SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用 ...

  8. Spel spring表达式

    文章目录 SpEL ExpressionParser接口 工作原理 EvaluationContext接口 Expression接口 测试类 基本表达式 字面量表达式 算数运算表达式 关系表达式 逻辑 ...

  9. 【Spring应用】SPEL表达式使用

    Spring框架中的SpEL(Spring Expression Language,Spring表达式语言)是一种基于字符串的表达式语言,用于支持在运行时动态地计算表达式的值.它可以在Spring的多 ...

最新文章

  1. python使用正则表达式验证用户输入密码的有效性
  2. tomcat 和 jdk 版本 对应关系
  3. 对象级别锁 vs 类级别锁 – Java
  4. JSF 2.2: HTML5 Support
  5. s3c2416开发板 linux,S3C2416移植内核Linux3.1的wm9713声卡过程
  6. 恩施机器人编程_恩施安川机器人水切切割编程
  7. 《MySQL技术内幕(SQL编程)》——查询处理
  8. 保姆级解决办法使用企业版MyEclipse出现MyEclipse Trial Expired解决方法及激活
  9. 头哥数据结构和算法答案
  10. 投资理财启蒙之定投出一个千万富翁?
  11. 你怎么保存微博中喜欢的视频
  12. 圆桌实录 | 为什么不约而同选择了大 Kernel
  13. 《形式感+——网页视觉设计创意拓展与快速表现》
  14. python中Try的运用及意义
  15. VMware View for iPad,上座率最高的iPad免费软件
  16. 如何更新seaborn库_Python 绘图总结(seaborn库的使用) (上)
  17. 显示器支架什么品牌好?
  18. event-log-tags
  19. 南华大学计算机学院王玉锋,喜报!南华大学和王玉锋同学双双获奖!
  20. 台式计算机可以接收无线不,台式电脑无线接收器插上连不上网怎么处理

热门文章

  1. C语言指针是什么?1分钟彻底理解C语言指针的概念
  2. C++字符串详解(三) 字符串的增删改
  3. sql substr切割字符串
  4. 空间金字塔池化SPP
  5. shell 指令集锦
  6. python 文件处理1:将某一目录下的文件合并
  7. 数学建模太难,如何以Tableau可视化的方式打开?
  8. Flink从入门到精通100篇(二十一)-万字长文详解 Flink 中的 CopyOnWriteStateTable
  9. 探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类
  10. 在Windows环境下配置QT Creator 读取NC文件(NetCDP,C++接口)