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

Posted

技术标签:

【中文标题】带有@Value 的 Spring 表达式语言 (SpEL):美元与哈希($ 与 #)【英文标题】:Spring Expression Language (SpEL) with @Value: dollar vs. hash ($ vs. #) 【发布时间】:2011-07-16 09:50:31 【问题描述】:

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

我的问题是:

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

【问题讨论】:

【参考方案1】:

尝试阅读this article,这表明

“如果使用哈希,则每次在部分刷新中包含该元素时(即每次呈现)都会重新计算您的代码。如果您使用美元,则仅在最初加载页面时计算您的代码. 但这已经超出了 EL,也扩展到了 SSJS。在哈希或美元之后,花括号表示您的语言的开始和结束。这在我们稍后结合语言时将很重要。"

【讨论】:

与 Spring EL 无关,都是 JSP EL。 @skaffman:尽管你是对的,当然,这是一个有趣的信息(至少对我来说......)。 Another answer 说“没有 JSP EL,JSP 使用 SpEL”。对吗? Java EE 规范中有一个“表达式语言”(EL),旨在用于 JSP 和 JSF。与 Spring EL 无关。【参考方案2】:

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

#... 是SpEL syntax,它的功能要强大得多,也更复杂。它还可以处理属性占位符,等等。

两者都是有效的,都没有被弃用。

【讨论】:

为了使用 SpEL 语法成功访问属性值,请使用格式"#'$property'" 回复:上面的评论 - 另见this answer【参考方案3】:

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

第 2 页:

eval 表达式是通过使用结构 $expr 或 #expr 形成的。两个都 EL 以完全相同的方式解析和评估结构,即使 它们在使用 EL 的技术中可能具有不同的含义。

【讨论】:

这应该回答我问题的哪一部分?它是从 2006 年开始的,“以完全相同的方式解析和评估”和“可能具有不同的含义”之类的词可能就像你可以说的那样模糊。【参考方案4】:

$expr --> 立即评估

#expr --> 延迟评估

立即评估意味着在页面第一次呈现时立即评估表达式并返回结果。延迟评估意味着使用表达式语言的技术可以在页面生命周期的稍后时间使用自己的机制来评估表达式,只要合适的话。

Complete reference here

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

【讨论】:

您说的是Java EE Web 技术,而问题是关于使用Spring EL 的spring config。然后,JSP 不使用 SpEL,你甚至不需要 Spring 来运行 JSP 在JSP上最后一句使用SpEL是完全错误的。 进一步澄清:从 2.1 版开始的 JSP。支持作为 SpEL 模板的统一 EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html。来自 Spring 文档:“Spring 表达式语言(简称 SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于统一 EL,但提供了附加功能,最显着的是方法调用和基本字符串模板功能。”

以上是关于带有@Value 的 Spring 表达式语言 (SpEL):美元与哈希($ 与 #)的主要内容,如果未能解决你的问题,请参考以下文章

spring spel表达式语言

如何在 Spring @Value 注解中正确指定默认值?

Spring 资源注入

Spring EL和资源调用

带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件不解析 @Value 注释

Spring Boot 2 + Junit 5:带有@Value 的空值