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

sjn*_*ngm 120 spring dependency-injection spring-el

我什么时候使用就有点糊涂了${...}比较#{...}.Spring的文档仅使用#{...},但有很多示例使用${...}.此外,当我开始使用SpEL时,我被告知要使用${...}它并且工作正常.

对于那些困惑的人来说,我将如何使用它

@Component
public class ProxyConfiguration {

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

    :
}
Run Code Online (Sandbox Code Playgroud)

和一些属性文件:

proxy.host=myproxy.host
proxy.port=8000
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

ska*_*man 130

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

#{...}SpEL语法,它更强大,更复杂.它还可以处理属性占位符,还有更多.

两者都有效,并且都不被弃用.

  • 要使用SpEL语法成功访问属性值,请使用格式""#{'$ {property}'}"` (19认同)
  • 回复:上面的评论 - 另请参阅[此答案](/sf/ask/2639359411/#37706167) (2认同)
  • 您可以使用`${proxy.port}`或`#{environment['proxy.port']}`来检索属性的相同值,当然后者更长,但它是基于SpEL的,因此您能够进行一些操作 (2认同)

小智 9

${expr} - >立即评估

#{expr} - >延期评估

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

完整参考

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

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