前言

SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是数组列表型数据,因此可以缩减代码量,优化代码结构。个人认为很有用。

1 语法说明

1.1 SpEL 字面量:

  • 整数:#{8}
  • 小数:#{8.8}
  • 科学计数法:#{1e4}
  • String:可以使用单引号或者双引号作为字符串的定界符号。
  • Boolean:#{true}

1.2 SpEL引用bean , 属性和方法:

  • 引用其他对象:#{car}
  • 引用其他对象的属性:#{car.brand}
  • 调用其它方法 , 还可以链式操作:#{car.toString()}
  • 调用静态方法静态属性:#{T(java.lang.Math).PI}

 1.3 SpEL支持的运算符号:

  • 算术运算符:+,-,*,/,%,^(加号还可以用作字符串连接)
  • 比较运算符:< , > , == , >= , <= , lt , gt , eg , le , ge
  • 逻辑运算符:and , or , not , |
  • if-else 运算符(类似三目运算符):?:(temary), ?:(Elvis)
  • 正则表达式:#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}

2. 基本用法

SpEL有三种用法:

1. 是在注解@Value中;

2. 在XML配置中;

3. 代码块中使用Expression。

2.1 @Value

    //@Value能修饰成员变量和方法形参//#{}内就是表达式的内容@Value("#{表达式}")public String arg;

2.2 <bean>配置

<bean id="xxx" class="com.java.XXXXX.xx"><!-- 同@Value,#{}内是表达式的值,可放在property或constructor-arg内 --><property name="arg" value="#{表达式}">
</bean>

2.3 代码块中使用

public class SpELTest {public static void main(String[] args) {//创建ExpressionParser解析表达式ExpressionParser parser = new SpelExpressionParser();//表达式放置Expression exp = parser.parseExpression("表达式");//执行表达式,默认容器是spring本身的容器:ApplicationContextObject value = exp.getValue();/**如果使用其他的容器,则用下面的方法*///创建一个虚拟的容器EvaluationContextStandardEvaluationContext ctx = new StandardEvaluationContext();//向容器内添加beanBeanA beanA = new BeanA();ctx.setVariable("bean_id", beanA);//setRootObject并非必须;一个EvaluationContext只能有一个RootObject,引用它的属性时,可以不加前缀ctx.setRootObject(XXX);//getValue有参数ctx,从新的容器中根据SpEL表达式获取所需的值Object value = exp.getValue(ctx);}
}

4 #{…}和${…}

  • #{…} 用于执行SpEl表达式,并将内容赋值给属性
  • ${…} 主要用于加载外部属性文件中的值
  • #{…} 和${…} 可以混合使用,但是必须#{}外面,${}在里面

4.1 ${…}用法

{}里面的内容必须符合SpEL表达式,通过@Value(“${spelDefault.value}”)可以获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。可以通过赋予默认值解决这个问题,如@Value("${spelDefault.value:127.0.0.1}")

// 如果属性文件没有spelDefault.value,则会报错//  @Value("${spelDefault.value}")//  private String spelDefault2;// 使用default.value设置值,如果不存在则使用默认值@Value("${spelDefault.value:127.0.0.1}")private String spelDefault;

4.2 #{…}用法

这里只演示简单用法

    // SpEL:调用字符串Hello World的concat方法@Value("#{'Hello World'.concat('!')}")private String helloWorld;// SpEL: 调用字符串的getBytes方法,然后调用length属性@Value("#{'Hello World'.bytes.length}")private String helloWorldbytes;

4.3 ${…}和#{…}混合使用

${...}和#{...}可以混合使用,如下文代码执行顺序:通过${server.name}从属性文件中获取值并进行替换,然后就变成了 执行SpEL表达式{‘server1,server2,server3’.split(‘,’)}。

// SpEL: 传入一个字符串,根据","切分后插入列表中, #{}和${}配置使用(注意单引号,注意不能反过来${}在外面,#{}在里面)@Value("#{'${server.name}'.split(',')}")private List<String> servers;

在上文中在#{}外面,${}在里面可以执行成功,那么反过来是否可以呢${}在外面,#{}在里面,如代码

// SpEL: 注意不能反过来${}在外面,#{}在里面,这个会执行失败@Value("${#{'HelloWorld'.concat('_')}}")private List<String> servers2;

答案是不能。因为spring执行${}是时机要早于#{}。在本例中,Spring会尝试从属性中查找#{‘HelloWorld’.concat(‘_’)},那么肯定找不到,由上文已知如果找不到,然后报错。所以${}在外面,#{}在里面是非法操作

SpEL 在注解中的使用相关推荐

  1. Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式

    Spring  EL 一:在Spring xml 配置文件中运用   Spring EL Spring EL 采用 #{Sp Expression  Language} 即 #{spring表达式} ...

  2. Struts2 注解中跳转 action

    转自:http://hi.baidu.com/fo_guo/item/71f6b636fec1e8cf382ffa00 在xml中跳转action我想大家都是会的,那么注解中跳转其实也很类似,废话不多 ...

  3. 如何获取注解中的值_如何在运行时利用注解信息

    注解( annontation )是 Java 1.5 之后引入的一个为程序添加元数据的功能.注解本身并不是魔法,只是在代码里添加了描述代码自身的信息,至于如何理解和使用这些信息,则需要专门的解析代码 ...

  4. 通过拦截器获取控制类requestMapping注解中的属性值

     1.控制类: /*** 根据id删除*/@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE,n ...

  5. springboot源码(二)@SpringBootApplication注解中exclude参数使用及原理

    文章目录 一.使用姿势 二.运行原理 上篇文章中, <springboot源码(一)启动流程+自动配置原理分析>,简单分析了启动流程,其中涉及到了@SpringBootApplicatio ...

  6. Spring注解驱动开发第10讲——在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,不仅可以使用@Import注解快速向容器中导入bean,也可以在@Import注解中使用ImportSe ...

  7. Transactional注解中事务的传播行为

    目录 1.Transactional注解中七种事务传播行为 2.为什么要控制事务的传播行为 3.事务的传播行为使用例子 4.@Transactional注解失效的场景 5.总结 Transaction ...

  8. @NotNull 注解中groups 的用法

    原来: @Data public class User {private Integer id;@NotNull(message = "用户名不能为空")private Strin ...

  9. GreenDao 3.x 注解中ToOne和ToMany的个人理解

    GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...

最新文章

  1. 一个项目中既有移动端,同时也有PC端的代码,并且 他们的代码分开写的,那么如何实现在手机跳转手机页面,pc点击跳转pc页面...
  2. EF延迟加载LazyLoading
  3. UML部署图和构件图
  4. 乔布斯亲笔签名Apple II使用手册拍出80万美元高价
  5. mac安装thrift
  6. VMWare虚拟机安装RedHat Linux全过程
  7. 练习: 将一个int[] 中元素,转成字符串格式
  8. 《老路用得上的商学课》41-45学习笔记
  9. 暴走欧洲之文明的迭代
  10. win10怎么设置计算机语言,Win10系统怎么设置中文语言_windows10怎么把系统语言设置成中文...
  11. javaEE练习(商城练习)
  12. matlab中生成随机正交矩阵
  13. 小程序可以删除或者注销吗
  14. 中国各个省份的id代号是多少?各省简称是什么?
  15. windowmediaplayer控件出现未能加载的问题
  16. 解锁编程新姿势——键盘技巧篇
  17. 16.控制转移指令(条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令)
  18. 来说一说毕达哥拉斯定理
  19. 黑马Redis实战篇—给商铺类型缓存(练习)
  20. sina 微博 签名档~~~

热门文章

  1. pythonchallenge 第五关
  2. Python学习笔记7:实操案例四(支付密码的验证,模拟QQ账号登录,商品价格竞猜,星座看运势)
  3. 高数__已知一个平面方程_求平行的平面,并且经过某点
  4. Android 视频直播
  5. 第四章 单分支结构、二分结构与多分支结构
  6. 学编程,有哪些必备的在线教程网站?
  7. UE4迁移继承自C++的蓝图类(痛苦经历)
  8. 成三棋、九子棋、十二子棋
  9. fancybox参数设置
  10. linux共享usb设备,USB设备共享步骤教程