一、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. HDU-1698-Just a Hook-线段树区间修改

    In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...

  2. ZOJ - 2423-Fractal

    A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on ...

  3. 如何备份和恢复你的TFS服务器(三)

    进行一次备份 当然,如果你已经建立了一个时间表,那么备份会在指定的时间自动地进行,但是我真的无法给你展示一张很酷的截图——那是不可见的:).无论你是否建立了一个时间表.你都可以在任意时间执行一次完整的 ...

  4. SparkSQL – 从0到1认识Catalyst(转载)

    最近想来,大数据相关技术与传统型数据库技术很多都是相互融合.互相借鉴的.传统型数据库强势在于其久经考验的SQL优化器经验,弱势在于分布式领域的高可用性.容错性.扩展性等,假以时日,让其经过一定的改造, ...

  5. 欢迎加入.NET Core 技术QQ群一起讨论交流学习

    群号:4656606 介绍:本群主要讨论.NET Core及其相关技术,如:IdentityServer4.ABP.Dcoker.Linux.Devops.微服务等,如果你正在使用或者准备使用.NET ...

  6. Python通过pip方式安装第三方模块的两种方式

    一:环境 python3.6 windows 10 二:常用命令 如果直接执行pip命令报错,说明pip不在path环境变量中 解决方法: python -m pip list 以下默认可直接使用pi ...

  7. .net排坑篇:负载均衡域名转发的背后

    背景 昨天因客户私有部署问题,需要到客户公司去排查问题. 他们是一家外企,各种权限需要提前申请(最大的坑).他们之前部署的一般为单域名,很少部署互联网类型多个域名的情形(第二个坑).这次私有部署总计使 ...

  8. Python爬取豆瓣指定书籍的短评

    Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...

  9. Mysql乱码问题总结

    这两天研究了下Mysql的字符集编码和排序规则,有个很典型的问题就是乱码问题.所以小记一下. http://www.jianshu.com/p/4c6a27542df4 http://blog.csd ...

  10. 通过Webstorm上传代码到Github、更新代码后同步到github及克隆github代码到本地的方法

    导读: Github做为IT爱好者分享代码的一个知名的平台,广受大家喜欢,那么我们平时该怎么将自己写的代码上传到github上面保存并且提供给其他人参考? 我想方法不外乎如下几个: 1.直接在gith ...