SpEL、PropertyPlaceholderConfigurer与@Value、#{}、${}
概念
SpEL:Spring EL表达式
PropertyPlaceholderConfigurer:即org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.java。我们通常通过配置一个PropertyPlaceholderConfigurer类型的bean,来将properties文件交给Spring来托管。
@Value、#{}、${}:通过@Value、#{}、${},可以读取受Spring托管的配置。(被托管的配置可能是properties文件、常量类的bean)
一、Spring EL表达式
EL表达式三个概念:
- 1. expression(表达式)
- 2. context(上下文)
- 3. root object(根对象)
Expression是从指定的上下文中获取相应的内容。
也就是说,Expression指定了要获取的property name,但还需要指定从什么地方获取该property value。
EL中可以从上下文context和root object中获取property value。
org.springframework.expression.Expression中提供了很多取property value的方法,如下几个比较重要:
从default standard context中获取property value
/**
* Evaluate this expression in the default standard context.
* @return the evaluation result
* @throws EvaluationException if there is a problem during evaluation
*/
Object getValue() throws EvaluationException;
从指定的context中获取property value
/**
* Evaluate this expression in the provided context and return the result of evaluation.
* @param context the context in which to evaluate the expression
* @return the evaluation result
* @throws EvaluationException if there is a problem during evaluation
*/
Object getValue(EvaluationContext context) throws EvaluationException;
从指定的root object中获取property value
/**
* Evaluate this expression against the specified root object
* @param rootObject the root object against which properties/etc will be resolved
* @return the evaluation result
* @throws EvaluationException if there is a problem during evaluation
*/
Object getValue(Object rootObject) throws EvaluationException;
EL表达式的功能
| 英文 | 中文 | 
|---|---|
| Literal expressions | 字面值表达式 | 
| Boolean and relational operators | 布尔和关系操作符 | 
| Regular expressions | 正则表达式 | 
| Class expressions | 类表达式 | 
| Accessing properties, arrays, lists, maps | 访问properties、arrays、lists、maps | 
| Method invocation | 方法调用 | 
| Relational operators | 关系操作符 | 
| Assignment | 赋值 | 
| Calling constructors | 调用构造器 | 
| Bean references | bean引用 | 
| Array construction | 构建数组 | 
| Inline lists | 内联lists | 
| Inline maps | 内联maps | 
| Ternary operator | 三元操作符 | 
| Variables | 变量 | 
| User defined functions | 用户定义的功能 | 
| Collection projection | 集合投影 | 
| Collection selection | 集合选择 | 
| Templated expressions | 模板化表达式 | 
参考:
[1]http://www.cnblogs.com/larryzeal/p/5964621.html
[2]http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#expressions
二、 @Value、#{}、${}
http://www.cnblogs.com/larryzeal/p/5910149.html
Spring的属性注入,都依赖属性文件是受Spring容器管理的。
可以这么说,想要使用Spring的功能,那么,你的资源(实体、类、资源文件等)都必需受Spring容器的管理。当然,properties文件也不例外。
Spring对#{}和${}的支持,是通过org.springframework.expression.common.TemplateAwareExpressionParser来实现的。
public Expression parseExpression(String expressionString, ParserContext context)
throws ParseException {
if (context == null) {
context = NON_TEMPLATE_PARSER_CONTEXT;
}
if (context.isTemplate()) { // 按${}来处理
return parseTemplate(expressionString, context);
}
else { // 按#{}来处理,即使用EL表达式来处理
return doParseExpression(expressionString, context);
}
}

EL对应的解析器:StandardBeanExpressionResolver
要将配置文件给Spring管理的话,一般会使用如下配置:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/props/jdbc.properties</value>
</list>
</property>
</bean>
这样我们就能在Spring环境下来使用它了。
@Value
@Value的值有两类:
- ① ${ property : default_value }
- ② #{ obj.property? : default_value }
 就是说,第一个注入的是参数对应的property,第二个则是SpEL表达式对应的内容。 那个 default_value,就是前面的值为空时的默认值。注意二者的不同。
${key}
取properties文件中key对应的value。本质上是取PropertyPlaceholderConfigurer这个bean中的key对应的value。
#{object.field}
#是SpEl表达式,它取的是对象的属性。注意,这个对象object必需是Spring的Bean。
#{'${key}'}
$与#可以结合起来一起使用。可以参看例子:com.cn.kvn.framework.property_test.spel.SpelDomain.java
SpEL、PropertyPlaceholderConfigurer与@Value、#{}、${}的更多相关文章
- Spring 使用介绍(四)—— SpEL
		一.SpEL介绍 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,可在运行时构建复杂表达式 使用步骤: 1)创建解析器:ExpressionP ... 
- Spring学习记录(七)---表达式语言-SpEL
		SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ... 
- PropertiesFactoryBean PropertyPlaceholderConfigurer 区别
		正如 stackoverflow上说的,PropertiesFactoryBean 是PropertiesLoaderSupport 直接的实现类, 专门用来管理properties文件的工厂bean ... 
- Spring PropertyPlaceholderConfigurer数据库配置
		pom.xml中添加依赖 <!-- mysql-connector-java --> <dependency> <groupId>mysql</groupId ... 
- spring-表达式语言-SpEL【转】
		Spring表达式语言(Spring Expression Language)简称:SpEL 课程概要: Spring表达式语言的入门介绍 Spring表达式语言的操作范围 Spring表达式语言的运 ... 
- spring的多个PropertyPlaceholderConfigurer实例装配的问题
		1. 默认情况下,使用PropertyPlaceholderConfigurer多实例装配出现异常 在项目中尝试 在不同的spring的配置文件中分别引入相应的properties文件,这样会在spr ... 
- Spring中的SPEL
		src\dayday\Person.java package dayday;/** * Created by I am master on 2016/11/28. */public class Per ... 
- Spring里PropertyPlaceholderConfigurer类的使用
		1. PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是 BeanFactoryPostProcessor接口的一个实现.PropertyPlaceho ... 
- spring spel
		•Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. •语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpE ... 
随机推荐
- Extjs4.x TreeGrid Dirty 更新数据,dirty标记不会自动清除的bug
			如上图所示,当修改某个属性值,成功提交后,dirty的小三角不会自动清除,这个是官方treegrid的一个bug,目前尚未解决. bug:http://www.sencha.com/forum/sho ... 
- 【oneday_onepage】——Microsoft adds a wing, more closets to the homes of SharePoint Online tenants
			To prevent SharePoint Online customers from feeling boxed in, Microsoft wants to improve the way the ... 
- Android studio 3+版本apk安装失败问题
			studio2.3升级到3.1之后将apk发给别人下载到手机上安装,华为提示安装包无效或与操作系统不兼容,魅族提示apk仅为测试版,要求下载正式版安装. 在网上找了一下,发现是studio3.0之后的 ... 
- 初步认识 LESS,我要开始学习LESS啦!
			LESS 是一个流行的样式表语言,它提供了 CSS3 也未曾实现的多种功能,让您编写 CSS 更加方便,更加直观.LESS 已经被广泛使用在多种框架中 ( 例如:BootStrap).本文将介绍 LE ... 
- 文本编辑工具(sublime text 2)
			学习地址: http://www.iplaysoft.com/sublimetext.html 下载地址:http://www.sublimetext.com 
- MongoDB C Driver Building on CentOS
			Building on Unix Prerequisites OpenSSL is required for authentication or for SSL connections to Mong ... 
- VS自带的dbghelp.h文件 报错
			场景: 编译报错: 解决方法: 在#include <dbghelp.h> 之前 #include <Windows.h> 
- SpringBoot系列六:SpringBoot整合Tomcat
			声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合 Tomcat 2.背景 SpringBoot 本身支持有两类的 WEB 容器:默认的 To ... 
- 图形界面至少要有一个顶级Swing容器
			图形界面至少要有一个顶级Swing容器 顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持 常用的顶级容器: JFrame(框架):表示主程序窗口 JDialog(对话框):每个J ... 
- application.properties详解 --springBoot配置文件
			本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ... 
