Spring Expression Language (SpEL) mit @Value: Dollar vs. Hash ($ vs. #)


126

Ich bin ein wenig verwirrt darüber, wann ich es verwenden ${...}soll #{...}. In der Spring-Dokumentation wird nur verwendet #{...}, es gibt jedoch viele Beispiele, die verwendet werden ${...}. Als ich mit SpEL anfing, wurde mir außerdem gesagt, dass ich es verwenden soll, ${...}und es funktioniert einwandfrei .

Für diejenigen, die verwirrt sind, wäre ein Beispiel, wie ich es benutze

@Component
public class ProxyConfiguration {

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

    :
}

und einige Eigenschaftendateien:

proxy.host=myproxy.host
proxy.port=8000

Meine Fragen sind:

  • Was sind die Unterschiede oder ist es das gleiche?
  • Ist eine Version veraltet, also sollte ich die andere verwenden?

Antworten:


139

${...}ist die Eigenschaftsplatzhaltersyntax. Es kann nur zum Dereferenzieren von Eigenschaften verwendet werden.

#{...}ist die SpEL-Syntax , die weitaus leistungsfähiger und komplexer ist. Es kann auch Platzhalter für Immobilien und vieles mehr verarbeiten.

Beide sind gültig und keiner ist veraltet.


22
Verwenden Sie das Format"#{'${property}'}"
Brice Roncace

1
Re: Kommentar oben - siehe auch diese Antwort
Steve Chambers

8

${expr} -> Sofortige Auswertung

#{expr} -> Aufgeschobene Bewertung

Sofortige Auswertung bedeutet, dass der Ausdruck ausgewertet und das Ergebnis zurückgegeben wird, sobald die Seite zum ersten Mal gerendert wird. Aufgeschobene Auswertung bedeutet, dass die Technologie, die die Ausdruckssprache verwendet, ihre eigene Maschinerie verwenden kann, um den Ausdruck einige Zeit später während des Lebenszyklus der Seite auszuwerten, wann immer dies angemessen ist.

Vollständige Referenz hier

Es gibt keine JSP-EL, JSP verwendet SpEL. SpEL passt zu der Technologie, die es verwendet.


6
Sie sprechen von einer Java EE-Webtechnologie, während die Frage nach der Spring-Konfiguration mit Spring ELs lautete. Und dann verwendet JSP kein SpEL, Sie brauchen nicht einmal Spring, um JSPs
auszuführen

3
Die letzte Aussage zur JSP mit SpEL ist rein falsch.
Michal M

2
Um noch weiter zu verdeutlichen: JSP ab Version 2.1. unterstützt Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html, das als Vorlage für SpEL diente. Aus dem Spring-Dokument: "Die Spring-Ausdruckssprache (kurz SpEL) ist eine leistungsstarke Ausdruckssprache, die das Abfragen und Bearbeiten eines Objektdiagramms zur Laufzeit unterstützt. Die Sprachsyntax ähnelt Unified EL, bietet jedoch zusätzliche Funktionen, insbesondere Methodenaufruf und grundlegende Funktionen String-Template-Funktionalität. "
Fritz Duchardt

-1

Versuchen Sie, diesen Artikel zu lesen , der vorschlägt

"Wenn der Hash verwendet wird, wird Ihr Code jedes Mal neu berechnet, wenn dieses Element in eine Teilaktualisierung einbezogen wird (dh jedes Mal, wenn es gerendert wird). Wenn Sie einen Dollar verwenden, wird Ihr Code nur berechnet, wenn die Seite zum ersten Mal geladen wird. Dies jedoch wurde über EL hinaus auch auf SSJS ausgedehnt. Nach dem Hash oder Dollar kennzeichnen die geschweiften Klammern den Anfang und das Ende Ihrer Sprache. Dies ist wichtig, wenn wir später Sprachen kombinieren möchten. "


13
Nichts hat etwas mit Spring EL zu tun, es geht um JSP EL.
Skaffman

@skaffman: Auch wenn du recht hast, ist es natürlich eine interessante Info (zumindest für mich ...).
sjngm

Eine andere Antwort besagt, dass "es keine JSP-EL gibt, JSP verwendet SpEL". Ist das korrekt?
Carl G

1
In der Java EE-Spezifikation gibt es eine "Expression Language" (EL), die in JSPs und von JSF verwendet werden soll. Es hat nichts mit Spring EL zu tun.
Gregfqt

-4

Spezifikation der Ausdruckssprache • Endgültige Veröffentlichung - 8. Mai 2006

Seite 2:

Ein Auswertungsausdruck wird unter Verwendung der Konstrukte $ {expr} oder # {expr} gebildet. Beide Konstrukte werden von der EL auf genau die gleiche Weise analysiert und bewertet, obwohl sie in der Technologie, die die EL verwendet, möglicherweise unterschiedliche Bedeutungen haben.


2
Welchen Teil meiner Frage soll das beantworten? Es ist aus dem Jahr 2006 und Wörter wie "genau auf die gleiche Weise analysiert und bewertet" und "möglicherweise unterschiedliche Bedeutungen haben" sind wahrscheinlich so vage, wie Sie es wahrscheinlich ausdrücken können.
sjngm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.