SpringValue语言(SpEL)与@Value:美元与哈希($与#)

对于何时使用${...}#{...}相比,我有点困惑。 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 

我的问题是:

  • 有什么不同或是一样的?
  • 是弃用的一个版本,所以我应该使用另一个?

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

#{...}是SpEL语法 ,它的function和复杂度要高得多。 它也可以处理财产占位符,还有更多。

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

${expr} – >立即评估

#{expr} – >延迟评估

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

完整的参考

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

尝试读这篇文章 ,这表明

“如果使用散列,那么每当元素包含在局部刷新中(即每次渲染时),都会重新计算代码。如果使用美元,则代码仅在页面初始加载时计算。已经超出了EL,也延伸到了SSJS,哈希值或者美元之后,大括号表示语言的开始和结束,这对我们后来结合语言来说是非常重要的。

expression式语言规范•最终版本 – 2006年5月8日

第2页:

一个evalexpression式是通过使用结构$ {expr}或#{expr}来形成的。 这两个构造都是由EL完全相同的方式进行分析和评估的,即使它们在使用EL的技术中可能有不同的含义。