一、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. 从源码看Spring Security之采坑笔记(Spring Boot篇)

    一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...

  2. 高效、易用、功能强大的 api 管理平台

    前言导读 实际环境的需求可以说是:只有你没想到,没有实现不了的,征对于目前实际开发.测试.生产等环境中,需要用到各类的接口可达几十.甚至上百个,因此,必须需要一个统一管理的工具平台来统一管理这类接口, ...

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

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

  4. semantic-ui 分割线

    分割线即原生html中的<hr>标签.不过semantic-ui中将<hr>美化了一下下. 1.基础分割线 需要注意的是分割线只能使用div标签和p标签,不能使用span标签. ...

  5. java.util.Collections.copy():列表List浅拷贝

    今天同事问我怎样将一个列表(list1)拷贝到另一个列表(list2),然后修改新的列表(list2)不会影响到旧的列表(list1),想了一想,这是深拷贝啊. 可是,除了循环new还有别的办法吗,想 ...

  6. Auzre系列1.1.1 —— 安装用于 IntelliJ 的 Azure 工具包

    (文中大部分内容(95%)Azure官网上有,我只是把我自己实际操作中遇到的问题在这里阐述一下.) 先决条件 若要完成文章中的步骤,需要安装用于 IntelliJ 的 Azure 工具包,该工具包需要 ...

  7. [官网]Linux版本历史

    This is a list of links to every changelog. https://kernelnewbies.org/LinuxVersions 总结一下 2.6.x 存在了八年 ...

  8. js获取数组中相同元素数量

    <script> var array = new Array(1,2,5,1,4,4,2,3,5,1,1,5,5,5,6,7,3,9,9,10); var arr = new Array( ...

  9. C# Note34: 异常机制相关小点

    1.使用throw和throw ex抛出异常的区别 通常,我们使用try/catch/finally语句块来捕获异常,那么在抛出异常的时候,使用throw和throw ex有什么区别呢? 假如,按顺序 ...

  10. js尾递归函数

    普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...