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 ...
随机推荐
- Eclipse调试Java的10个技巧【转】
clipse调试Java的10个技巧 先提三点 不要使用System.out.println作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志 1.条件断点 想象一下我们平时 ...
- 【进阶修炼】——改善C#程序质量(3)
32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...
- php 扩展包链接
https://pecl.php.net/package-stats.php?cid=7
- CSS(八):定位属性
一.position属性 1.relative(相对定位) 相对它原来的位置,通过指定偏移,到达新的位置. 扔在标准流中,它对父级盒子和相邻的盒子都没有任何影响. 看下面的例子: <!DOCTY ...
- Redis 实现消息队列 MQ
Redis 2.4版本之后就内置队列的功能了,如果是日常比较简单的队列应用,可以选择Redis , 效率还很高的!! Redis 还能实现 有序 和 无序 两种队列(只讨论生产者和消费者这种模式的队列 ...
- jQuery验证控件jquery.validate.js的使用介绍
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- java android使用Gson解析泛型json数据
那就直接开始吧. 在我们获取服务器返回的json数据有时候会出现这种情况,比如: {"body":{"attrName":"feed",&q ...
- [hadoop读书笔记] 第九章 构建Hadoop集群
P322 运行datanode和tasktracker的典型机器配置(2010年) 处理器:两个四核2-2.5GHz CPU 内存:16-46GN ECC RAM 磁盘存储器:4*1TB SATA 磁 ...
- Linux共享库 Linux内核链表
#ifndef __LINKEDLIST_H_ #define __LINKEDLIST_H_ #include <stdlib.h> #define offsetof(type, mem ...