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

Kru*_*hna 7 java spring spring-el

我有以下弹簧配置:

<context:property-placeholder location="classpath:commonSql.properties" />
Run Code Online (Sandbox Code Playgroud)

现在在我的课堂上,当我使用@value("#{someproperty}")它时,它不起作用.然后,我改变了 @value("${someproperty}")它并且它起作用了.

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

最重要的是@value("#{someproperty}")在工作时@value("${someproperty}")不工作.

Vit*_*aly 5

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

表达式语言意味着有特定的语法、对象、变量等。

当你写“#{someproperty}”时,你实际上指的是对象和表达式语言引擎回答你:

在类型“org.springframework.beans.factory.config.BeanExpressionContext”的对象上找不到字段或属性“someproperty”

这是有效的:

  @Value("#{'${someproperty}'}")
Run Code Online (Sandbox Code Playgroud)


Hun*_*hao 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
Run Code Online (Sandbox Code Playgroud)