为什么在下面的情况下@value(" $ {someProperty}")正在工作,而@value("#{someProperty}")无效

时间:2013-04-17 07:28:44

标签: java spring spring-el

我有以下弹簧配置:

<context:property-placeholder location="classpath:commonSql.properties" />

现在在我的课堂上,当我使用@value("#{someproperty}")时,它无效。然后,我改为 @value("${someproperty}")它有效。

根据this的回答,问题@value("#{someproperty}")是SpEL语法,它更强大,更复杂。它还可以处理属性占位符,还有更多,但在我的情况下为什么它不起作用?虽然简单的是如何使用$和#来评估价值。

@value("#{someproperty}")工作时主要是@value("${someproperty}")无效。

2 个答案:

答案 0 :(得分:4)

#{ }是一种表达式语言功能,而${ }是一种简单的属性占位符语法。

表达式语言意味着存在特定的语法,对象,变量等。

当你写#34;#{someproperty}&#34;时,你实际上是指对象而表达式语言引擎会回答你:

  

字段或财产&#39; someproperty&#39;在类型的对象上找不到   &#39; org.springframework.beans.factory.config.BeanExpressionContext&#39;

以下是可行的:

  @Value("#{'${someproperty}'}")

答案 1 :(得分:0)

以下是spring的源代码,它显示了获取属性键的表达式,原因很明显,也许可以帮助你:)

/** 
 * Abstract base class for PropertyEditors that need 
 * to resolve placeholders in paths. 
 * 
 * <p>A path may contain ${...} placeholders, to be resolved as 
 * system properties: e.g. ${user.dir}. 
 * 
 * @author Juergen Hoeller 
 * @since 1.1.2 
 * @see #PLACEHOLDER_PREFIX 
 * @see #PLACEHOLDER_SUFFIX 
 * @see System#getProperty(String) 
 */  
public class AbstractPathResolvingPropertyEditor extends PropertyEditorSupport {  

    public static final String PLACEHOLDER_PREFIX = "${";  

    public static final String PLACEHOLDER_SUFFIX = "}";  

    protected static final Log logger = LogFactory.getLog(  
            AbstractPathResolvingPropertyEditor.class);  
  ...etc