一、SpEL介绍

Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,可在运行时构建复杂表达式

使用步骤:

1)创建解析器:ExpressionParser接口表示解析器,SpelExpressionParser提供默认实现

2)解析表达式:使用ExpressionParser.parseExpression()方法,将表达式解析为Expression对象

3)构造上下文:用于定义变量,由EvaluationContext接口表示,StandardEvaluationContext提供默认实现

4)求值:使用Expression.getValue()方法,根据上下文求得表达式值

@Test
public void testSpel() {
// spel解析器
ExpressionParser parser = new SpelExpressionParser(); // spel语句
Expression expression1 = parser.parseExpression("895");
Assert.assertTrue(895 == expression1.getValue(int.class)); // spel语句
Expression expression2 = parser.parseExpression("'hello'");
Assert.assertTrue(StringUtils.equals("hello", expression2.getValue(String.class))); // spel上下文
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("end", "zz");
Expression expression3 = parser.parseExpression("('yy' + 'pp').concat(#end)");
Assert.assertTrue(StringUtils.equals("yyppzz", expression3.getValue(context, String.class)));
}

二、在bean定义中使用SpEL

ApplicationContext实现默认支持SpEL,在Bean定义时注入时,使用“#{SpEL表达式}”表示

1)xml方式

<bean id="str1" class="java.lang.String">
<constructor-arg index="0" value="uouu"/>
</bean> <bean id="propBean" class="java.lang.String">
<constructor-arg index="0" value="#{str1}"/>
</bean>
@Test
public void testSpel2() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
String prop = context.getBean("propBean", String.class);
Assert.assertTrue(StringUtils.equals("uouu", prop));
}

2)注解方式

public class Hello {
@Value("#{str1}")
private String password; public String getPassword() {
return password;
}
}
<!-- 定义bean -->
<bean class="cn.matt.spel.Hello"></bean> <!-- 开启注解 -->
<context:annotation-config />
@Test
public void testSpel3() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
Hello hello = context.getBean(Hello.class);
Assert.assertTrue(StringUtils.equals("uouu", hello.getPassword()));
}

三、属性文件的使用

spring属性文件配置方式:

<!-- 全写方式 -->
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc1.properties</value>
<value>jdbc2.properties</value>
</list>
</property>
</bean>

上述配置的简写方式:

<!-- 简写方式 -->
<context:property-placeholder location="classpath:jdbc1.properties,classpath:jdbc2.properties"/>

使用实例如下:

# jdbc1.properties 文件
username=root
password=root
# jdbc2.properties 文件
username=admin
password=admin
<bean id="propBean" class="java.lang.String">
<constructor-arg index="0" value="${password}"/>
</bean>
@Test
public void testSpel2() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
String prop = context.getBean("propBean", String.class);
Assert.assertTrue(StringUtils.equals("admin", prop));
}

注:

1)spring使用“${属性名}”表示属性值,与SpEL使用"#{SpEL表达式}"不同

2)在多个属性文件中存在相同的属性值时,后者覆盖前者

3)支持注解方式,使用方式与SpEL注解类似,如:@Value("${password}")

参考:

第五章 Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3

第五章 Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3

第五章 Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3

spring <context:property-placeholder>使用说明

使用<context:property-placeholder>标签导入多个properties文件

Spring 使用介绍(四)—— SpEL的更多相关文章

  1. [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  3. Spring 的介绍和目标

    1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...

  4. Spring的第四天AOP之注解版

    Spring的第四天AOP之注解版 ssm框架 spring  在上一篇博客中,介绍了Spring的AOP的xml版本的使用,在这篇博客中,我将介绍一下,注解版的使用. 常用注解 注解 通知 @Aft ...

  5. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

  6. Spring DevTools 介绍

    Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...

  7. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  8. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  9. 转:深入浅出spring IOC中四种依赖注入方式

    转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...

  10. 普通java类加入spring容器的四种方式

    今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...

随机推荐

  1. HTML5事件

    Html5事件 contextmenu事件 用以表示何时应该显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义的菜单. 由于此事件时冒泡的,因此可以为document指定一个事件处理程序,用 ...

  2. Linux ip netns 命令

    ip netns 命令用来管理 network namespace.它可以创建命名的 network namespace,然后通过名字来引用 network namespace,所以使用起来很方便. ...

  3. Linux Namespace : Mount

    Mount namespace 为进程提供独立的文件系统视图.简单点说就是,mount namespace 用来隔离文件系统的挂载点,这样进程就只能看到自己的 mount namespace 中的文件 ...

  4. Visual studio 2015 Community 安装过程中遇到问题的终极解决

    早就有给自己电脑升级VS的想法,可是安装过程并不顺利,一直拖到现在,昨天下定决心,把遇到的问题一个个解决,终于安装成功了,将安装过程中遇到的问题和解决方法记录一下. 需要说明一下的是,不同的电脑环境可 ...

  5. OM1、OM2、OM3和OM4光纤之间的区别

    “OM”stand for optical multi-mode,即光模式,是多模光纤表示光纤等级的标准.不同等级传输时的带宽和最大距离不同,从以下几个方面分析它们之间的区别.  一.OM1.OM2. ...

  6. python之psutil模块详解(Linux)--小白博客

    Python-psutil模块 windows系统监控实例,查询 https://www.cnblogs.com/zhou2019/p/10567282.html 1.简单介绍 psutil是一个跨平 ...

  7. python_函数名的应用、闭包、装饰器

    0.动态传参内容补充: 0.1 单纯运行如下函数不会报错. def func1(*args,**kwargs): pass func1() 0.2 *的魔性用法 * 在函数定义的时候,代表聚合. *在 ...

  8. semantic-ui 输入框

    1.标准输入框 semantic-ui中定义输入框需要将input标签包含于另外一个标签内,外层标签的class为ui input,注意外层标签可以是div,span.p.i. <div cla ...

  9. [转帖]Windows 内核说明

    来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面 ...

  10. 【Java基础】for循环实现在控制台打印水仙花数

    代码: /* * 需求:在控制台输出所有的”水仙花数” * * 分析: * 什么是水仙花数呢? * 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身. * 举例:153就是一个水仙花数. ...