Spring Expression Language (SpEL) z @Value: dolar vs. hash ($ vs. #)

126

Jestem trochę zdezorientowany, kiedy używać w ${...}porównaniu do #{...}. Dokumentacja Springa używa tylko #{...}, ale jest wiele przykładów, które używają ${...}. Ponadto, kiedy zacząłem ze SpEL, powiedziano mi, żebym go używał ${...}i działa dobrze.

Dla tych, którzy są zdezorientowani, byłby przykład tego, jak go używam

@Component
public class ProxyConfiguration {

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

    :
}

i jakiś plik właściwości:

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

Moje pytania to:

  • jakie są różnice czy to jest to samo?
  • czy jedna wersja jest przestarzała, więc powinienem użyć drugiej?
sjngm
źródło

Odpowiedzi:

139

${...}jest składnią symbolu zastępczego właściwości. Można go używać tylko do wyłuskiwania właściwości.

#{...}to składnia SpEL , która jest znacznie bardziej wszechstronna i złożona. Może również obsługiwać symbole zastępcze właściwości i wiele więcej.

Obie są prawidłowe i nie są przestarzałe.

skaffman
źródło
22
Aby z powodzeniem uzyskać dostęp do wartości właściwości za pomocą składni SpEL, użyj formatu"#{'${property}'}"
Brice Roncace
1
Re: komentarz powyżej - zobacz także tę odpowiedź
Steve Chambers
8

${expr} -> Natychmiastowa ocena

#{expr} -> Odroczona ocena

Natychmiastowa ocena oznacza, że ​​wyrażenie jest oceniane, a wynik zwracany zaraz po pierwszym wyrenderowaniu strony. Odroczona ocena oznacza, że ​​technologia używająca języka wyrażeń może użyć własnego mechanizmu do oceny wyrażenia później w trakcie cyklu życia strony, jeśli jest to właściwe.

Pełne odniesienie tutaj

Nie ma JSP EL, JSP używa SpEL. SpEL pasuje do technologii, która go używa.

XvrCJ
źródło
6
Mówisz o technologii internetowej Java EE, a pytanie dotyczyło konfiguracji wiosny przy użyciu Spring EL. A potem, JSP nie używać Spel, nie trzeba nawet Wiosna uruchomić JSP
gregfqt
3
Ostatnie zdanie na stronie JSP używającej SpEL jest całkowicie błędne.
Michał M
2
Aby wyjaśnić jeszcze dokładniej: JSP od wersji 2.1. obsługuje Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html, który służył jako szablon dla SpEL. Z dokumentacji Springa: „Spring Expression Language (w skrócie SpEL) to potężny język wyrażeń, który obsługuje zapytania i manipulowanie grafem obiektów w czasie wykonywania. Składnia języka jest podobna do Unified EL, ale oferuje dodatkowe funkcje, w szczególności wywoływanie metod i podstawowe funkcja tworzenia szablonów ciągów znaków. "
Fritz Duchardt
-1

Spróbuj przeczytać ten artykuł , który sugeruje

„Jeśli używany jest skrót, kod jest obliczany ponownie za każdym razem, gdy element jest włączany do częściowego odświeżania (tj. Za każdym razem, gdy jest renderowany). Jeśli używasz dolara, kod jest obliczany tylko przy pierwszym załadowaniu strony. Ale to został rozszerzony poza EL, również na SSJS. Po krzyżyku lub dolarach nawiasy klamrowe oznaczają początek i koniec języka. Będzie to ważne, gdy później przejdziemy do łączenia języków ”.

chrisp7575
źródło
13
Żaden z nich nie ma nic wspólnego z Spring EL, chodzi o JSP EL.
skaffman
@skaffman: chociaż masz rację, to oczywiście interesująca informacja (przynajmniej dla mnie ...).
sjngm
Inna odpowiedź mówi, że „nie ma JSP EL, JSP używa SpEL”. Czy to jest poprawne?
Carl G
1
W specyfikacji Java EE znajduje się „język wyrażeń” (EL), który ma być używany na stronach JSP i przez JSF. Nie ma to nic wspólnego z Spring EL.
gregfqt
-4

Specyfikacja języka wyrażeń • Wersja ostateczna - 8 maja 2006

Strona 2:

Wyrażenie eval jest tworzone przy użyciu konstrukcji $ {wyrażenie} lub # {wyrażenie}. Obie konstrukcje są analizowane i oceniane w dokładnie taki sam sposób przez EL, mimo że mogą mieć różne znaczenia w technologii, która używa EL.

Mellon
źródło
2
Na którą część mojego pytania ma odpowiedzieć? Pochodzi z 2006 roku, a słowa takie jak „przeanalizowane i ocenione dokładnie w ten sam sposób” i „może mieć różne znaczenia” są prawdopodobnie tak niejasne, jak można to ująć.
sjngm