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 ...
 
随机推荐
- docker 运行redis
			
自从接触docker之后,很多软件都想着用docker运行,毕竟手动安装的话老是要配一些环境变量啊,找配置文件修改配置什么的,docker却有更简便的办法. 正题: 建一个docker应用容器可以通过 ...
 - Graph-BFS-图的广度优先遍历
			
#include <iostream> #include <queue> using namespace std; /* 5 5 1 2 1 3 1 5 2 4 3 5 1 2 ...
 - 使用OpenOffice.org将各类文档转为PDF
			
http://blog.zhaojie.me/2010/05/convert-document-to-pdf-via-openoffice.html ————————————————————————— ...
 - HTML5规范尘埃落定,5个开发工具推荐
			
HTML5规范终于在今年正式定稿,对于从事多年HTML5开发的人员来说绝对是一个重大新闻.数字天堂董事长,DCloud CEO王安也发表了文章,从开发者和用户两个角度分析了HTML对两个人群的优势.其 ...
 - 关于Unity中地形的创建
			
地形创建 Raw图片格式是Unity可以导出的图片格式 Unity很强大,可以直接使用psd文件 地形创建实例 1.创建Unity工程和文件目录1:创建一个地形Terrain: GameObject- ...
 - 关于Unity中GrabPass截屏的使用和Shader的组织优化
			
GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { “ 纹理名称”}; 使用GrabPass {}后,可以用_G ...
 - pandas Series KeyError: -1
			
前几天写分析方法,遇到的一个错误: 具体我已经在stackoverflow 里面得到了详细的解答,下面我把问题和解决办法总结一下,方便日后的回顾 问题: sql = "select {}, ...
 - JUnit规则
			
在本节中,我们学习和了解JUnit中叫做规则的新功能,它允许非常灵活在测试类重新定义每个测试方法的行为.为了这个目的,@Rule注解被使用来标出测试类的公共字段.这些字段类型为MethodRule,这 ...
 - autofac解析Mvc和Webapi的坑
			
我们在项目中很早就开始使用autofac,也以为知道与mvc和webapi集成的做法. var builder = new ContainerBuilder(); // Mvc Register bu ...
 - IO多路复用的机制:select、poll、epoll
			
select.poll.epoll之间的区别总结[整理] IO多路复用之epoll总结 我读过的最好的epoll讲解--转自”知乎“