Spring Expression Language (SpEL) con @Value: dollaro contro hash ($ contro #)


126

Sono un po 'confuso riguardo a quando usare ${...}rispetto a #{...}. La documentazione di Spring usa solo #{...}, ma ci sono molti esempi che usano ${...}. Inoltre, quando ho iniziato con SpEL mi è stato detto di usarlo ${...}e funziona bene.

Per coloro che sono confusi, un esempio di come lo uso sarebbe

@Component
public class ProxyConfiguration {

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

    :
}

e alcuni file di proprietà:

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

Le mie domande sono:

  • quali sono le differenze o è la stessa cosa?
  • una versione è deprecata quindi dovrei usare l'altra?

Risposte:


140

${...}è la sintassi del segnaposto della proprietà. Può essere utilizzato solo per dereferenziare le proprietà.

#{...}è la sintassi SpEL , che è molto più capace e complessa. Può anche gestire segnaposto di proprietà e molto altro ancora.

Entrambi sono validi e nessuno dei due è deprecato.


22
Per accedere con successo ai valori delle proprietà utilizzando la sintassi SpEL, utilizzare il formato"#{'${property}'}"
Brice Roncace

1
Re: commento sopra - vedi anche questa risposta
Steve Chambers

8

${expr} -> Valutazione immediata

#{expr} -> Valutazione differita

La valutazione immediata significa che l'espressione viene valutata e il risultato restituito non appena viene eseguito il rendering della pagina. Valutazione differita significa che la tecnologia che utilizza il linguaggio delle espressioni può utilizzare il proprio macchinario per valutare l'espressione in un secondo momento durante il ciclo di vita della pagina, ogni volta che è appropriato farlo.

Riferimento completo qui

Non esiste JSP EL, JSP utilizza SpEL. SpEL si adatta alla tecnologia che lo utilizza.


6
Stai parlando di una tecnologia web Java EE mentre la domanda riguardava la configurazione della molla utilizzando Spring EL. E poi, JSP non usa SpEL, non hai nemmeno bisogno di Spring per eseguire JSP
gregfqt

3
L'ultima affermazione sul JSP che utilizza SpEL è del tutto sbagliata.
Michal M

2
Per chiarire ulteriormente: JSP a partire dalla versione 2.1. supporta Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html che fungeva da modello per SpEL. Dal documento di Spring: "Lo Spring Expression Language (abbreviato in SpEL) è un potente linguaggio di espressione che supporta l'interrogazione e la manipolazione di un oggetto grafico in fase di esecuzione. La sintassi del linguaggio è simile a Unified EL ma offre funzionalità aggiuntive, in particolare l'invocazione di metodi e funzionalità di creazione di modelli di stringhe. "
Fritz Duchardt

-1

Prova a leggere questo articolo , che suggerisce

"Se viene utilizzato l'hash, il codice viene ricalcolato ogni volta che l'elemento viene incluso in un aggiornamento parziale (ovvero ogni volta che viene visualizzato). Se si utilizza un dollaro, il codice viene calcolato solo quando la pagina viene caricata inizialmente. Ma questo è stato esteso oltre l'EL, anche a SSJS. Dopo l'hash o il dollaro, le parentesi graffe indicano l'inizio e la fine della tua lingua. Questo sarà importante quando arriveremo a combinare le lingue in seguito. "


13
Nessuno ha nulla a che fare con Spring EL, si tratta di JSP EL.
skaffman

@skaffman: anche se hai ragione, ovviamente, è un'informazione interessante (almeno per me ...).
sjngm

Un'altra risposta dice che "non esiste JSP EL, JSP usa SpEL". È corretto?
Carl G

1
Esiste un "Expression Language" (EL) nella specifica Java EE che deve essere utilizzato in JSP e da JSF. Non ha nulla a che fare con Spring EL.
gregfqt

-4

Specifiche del linguaggio Expression • Versione finale - 8 maggio 2006

Pagina 2:

Un'espressione eval viene formata utilizzando i costrutti $ {expr} o # {expr}. Entrambi i costrutti vengono analizzati e valutati esattamente nello stesso modo da EL, anche se potrebbero avere significati diversi nella tecnologia che utilizza EL.


2
Quale parte della mia domanda dovrebbe rispondere? È del 2006 e parole come "analizzato e valutato esattamente allo stesso modo" e "potrebbe avere significati diversi" sono probabilmente tanto vaghe quanto potresti dire.
sjngm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.