Spring 使用介绍(四)—— SpEL
一、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的更多相关文章
- [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring Boot入门(四):开发Web Api接口常用注解总结
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...
- Spring 的介绍和目标
1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...
- Spring的第四天AOP之注解版
Spring的第四天AOP之注解版 ssm框架 spring 在上一篇博客中,介绍了Spring的AOP的xml版本的使用,在这篇博客中,我将介绍一下,注解版的使用. 常用注解 注解 通知 @Aft ...
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...
- Spring DevTools 介绍
Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...
- Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】
Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用 ...
- Spring实战第四章学习笔记————面向切面的Spring
Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 普通java类加入spring容器的四种方式
今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...
随机推荐
- WPF仿网易云音乐系列(三、播放进度条+控制按钮)
一.简介 上一篇,咱们基本把左侧导航栏给搞定,这一篇文章,开始来做一下播放进度条和控制按钮:老规矩,咱们先来看一下原版的效果: 首先,它这个专辑图片,有一个按钮效果,鼠标移入会显示出伸缩箭头:移出后消 ...
- 我们都被GitHub出卖了!逃跑吧兄弟!
周一突然间爆出微软以75亿收购GitHub可真是一颗重磅炸弹,一下轰动整个软件业.如果你不是搞开发的这篇文章几本不会引起你的共鸣:如果你没有用源代码管理这个消息也只不过是个新闻:如果你是微软系的朋友那 ...
- 官宣 ! 52abp_Pro版本低调上线
上线了 官宣!官宣!官宣! 重要的事情说三次. 是的,你没有看错 https://www.52abp.com/ 的官方企业模板:52abp-pro已经正式上线. 至此52abp.com的官方网站就算告 ...
- ECS上配置FTP Filezilla
又来搞华为ECS 第一,服务器安装服务端 第二,设置被动模式,把服务器的公网IP填好 第三,生成一个服务器证书,客户端连接时接受 第四,设置自定义的被动连接端口比如 9000-9050 第五,去ECS ...
- Python-可变参数和关键字参数(*args **kw)
前言: Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数. 可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple: **kw是关键 ...
- ZOJ - 1610 经典线段树染色问题
这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急. 我们把左边的坐标+1,即可,那么[0, ...
- mysql有多大内存?能存多少数据?
Mysql: MySQL 3.22 限制的表大小为4GB. MyISAM 存储引擎: 最大表尺寸增加到了65536TB(2567 – 1字节).由于允许的表尺寸更大,MySQL数据库的最大有效表尺寸通 ...
- iOS iCloud云存储数据
https://www.jianshu.com/p/ce8cfaf6030e 2017.11.29 16:05* 字数 452 阅读 302评论 0喜欢 1 因为上一次做了用keychain来持久化存 ...
- 多线程系列之二:Single Thread Execution 模式
一,什么是SingleThreadExecution模式?同一时间内只能让一个线程执行处理 二,例子 1.不安全的情况 用程序模拟 三个人频繁地通过一个只允许一个人经过的门.当人通过时,统计人数便会增 ...
- 18-vue-cli脚手架项目中组件的使用
在webpack-simple模板中,包括webpck模板.一个.vue文件就是一个组件. 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包.同时webpack还 ...