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


126

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

我的问题是:

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

Answers:


139

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

#{...}SpEL语法,它的功能和复杂性要高得多。它也可以处理财产占位符,以及更多。

两者都是有效的,都不推荐使用。


22
为了使用SpEL语法成功访问属性值,请使用格式"#{'${property}'}"
Brice Roncace '16

1
回复:上面的评论-也看到这个答案
史蒂夫·钱伯斯

8

${expr} ->立即评估

#{expr} ->延期评估

立即求值意味着对表达式进行求值,并在首次呈现页面后立即返回结果。递延评估意味着使用表达语言的技术可以在页面生命周期的某个适当时候使用它自己的机制来评估表达。

在这里完整参考

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


6
您在谈论Java EE Web技术,而问题是关于使用Spring EL进行spring配置。然后,JSP不使用SpEL,您甚至不需要Spring即可运行JSP
gregfqt 2015年

3
关于使用SpEL的JSP的最后一条陈述纯属错误。
Michal M

2
为了进一步说明:从2.1版开始的JSP。支持统一EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html其中担任了规划环境地政司的模板。来自Spring文档:“ Spring表达式语言(简称SpEL)是一种功能强大的表达式语言,支持在运行时查询和操作对象图。该语言的语法类似于Unified EL,但提供了附加功能,最著名的是方法调用和基本功能。字符串模板功能。”
Fritz Duchardt

-1

尝试阅读这篇文章,这表明

“如果使用了哈希,则每次在部分刷新中包含该元素时(即,每次渲染时)都会重新计算您的代码。如果使用美元,则仅在初始加载页面时才计算代码。但是已经从EL扩展到了SSJS。在井号或美元之后,花括号表示您的语言的开始和结束。这对于以后组合语言非常重要。”


13
没有一个与Spring EL有任何关系,它是在谈论JSP EL。
skaffman 2011年

@skaffman:当然,即使你是对的,这也是一个有趣的信息(至少对我来说……)。
sjngm 2011年

另一个答案是“没有JSP EL,JSP使用SpEL”。那是对的吗?
卡尔·G

1
Java EE规范中有一种“表达语言”(EL),可以在JSP和JSF中使用。与Spring EL无关。
gregfqt 2015年

-4

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

第2页:

通过使用构造$ {expr}或#{expr}来形成一个eval-expression。EL可以完全相同的方式解析和评估这两种构造,即使它们在使用EL的技术中可能具有不同的含义。


2
这应该回答我问题的哪一部分?它是从2006年开始的,诸如“以完全相同的方式进行分析和评估”和“可能具有不同的含义”之类的词可能含糊其词。
sjngm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.