Spring 表达式语言(SpEL)的@Value: Dollar vs. hash ($vs. #)

我对什么时候使用 ${...}比使用 #{...}感到有点困惑。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

我的问题是:

  • 有什么不同,还是一样?
  • 是否有一个版本已经过时,因此我应该使用另一个版本?
58203 次浏览

尝试阅读 这篇文章,这意味着

”如果使用哈希,每次在部分刷新中包含该元素(即每次呈现该元素) ,都会重新计算代码。如果使用美元,则仅在最初加载页时计算代码。但是这已经超越了 EL,扩展到了 SSJS。在散列或美元之后,大括号表示语言的开始和结束。当我们以后开始组合语言时,这一点将非常重要。”

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

#{...}拼写语法,它的能力和复杂程度要高得多。它还可以处理属性占位符,以及其他更多内容。

两者都是有效的,并且都不会被弃用。

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

第二页:

Eval 表达式由构造 ${ expr }或 # { expr }构成 结构被 EL 以完全相同的方式解析和计算,即使 它们在使用 EL 的技术中可能具有不同的含义。

${expr}-> 即时评估

#{expr}-> 延迟评估

即时计算意味着对表达式进行计算,并在首次呈现页面时立即返回结果。延迟计算意味着使用表达式语言的技术可以在页面生命周期的晚些时候使用自己的机器来计算表达式,只要这样做是合适的。

这里有完整的参考资料

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