带@Value的Spring表达式语言(SpEL):美元与哈希($ vs.#)

时间:2011-03-16 08:24:43

标签: spring dependency-injection spring-el

关于何时使用${...}#{...}相比,我有点困惑。 Spring的文档仅使用#{...},但有很多示例使用${...}。此外,当我开始使用SpEL时,我被告知使用${...}并且它工作正常。

对于那些困惑的人,我如何使用它的一个例子是

@Component
public class ProxyConfiguration {

    @Value("${proxy.host}")
    private String host;
    @Value("${proxy.port}")
    private String port;

    :
}

和一些属性文件:

proxy.host=myproxy.host
proxy.port=8000

我的问题是:

  • 有什么区别或是否相同?
  • 是一个弃用的版本,所以我应该使用另一个版本?

4 个答案:

答案 0 :(得分:113)

${...}是属性占位符语法。它只能用于取消引用属性。

#{...}SpEL syntax,其能力和复杂程度更高。它还可以处理属性占位符,还有更多。

两者都有效,两者均未弃用。

答案 1 :(得分:10)

${expr} - >立即评估

#{expr} - >延期评估

  

立即评估意味着评估表达式,并在首次呈现页面时立即返回结果。延迟评估意味着使用表达式语言的技术可以使用自己的机制在页面生命周期的某个时间点评估表达式,只要适合这样做。

Complete reference here

没有JSP EL,JSP使用SpEL。 SpEL适合使用它的技术。

答案 2 :(得分:0)

尝试阅读this article,建议

“如果使用散列,则每次将该元素包含在部分刷新中时(即每次渲染时)都会重新计算代码。如果使用美元,则仅在最初加载页面时计算代码但是这已经超越了EL,也扩展到了SSJS。在哈希或美元之后,花括号表示你的语言的开头和结尾。这对我们以后组合语言很重要。“

答案 3 :(得分:-3)

表达语言规范•最终版本 - 2006年5月8日

第2页:

使用构造$ {expr}或#{expr}形成eval表达式。都 尽管如此,EL仍以完全相同的方式解析和评估构造 它们可能在使用EL的技术中具有不同的含义。