Spring Expression Language (SpEL) avec @Value: dollar vs hash ($ vs #)

126

Je ne sais pas quand utiliser ${...}par rapport à #{...}. La documentation de Spring n'utilise que #{...}, mais il existe de nombreux exemples qui utilisent ${...}. De plus, quand j'ai commencé avec SpEL, on m'a dit de l'utiliser ${...}et cela fonctionne très bien.

Pour ceux qui sont confus, un exemple de la façon dont je l'utilise serait

@Component
public class ProxyConfiguration {

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

    :
}

et un fichier de propriété:

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

Mes questions sont:

  • quelles sont les différences ou est-ce la même chose?
  • une version est-elle obsolète, je devrais donc utiliser l'autre?
sjngm
la source

Réponses:

140

${...}est la syntaxe de l'espace réservé de la propriété. Il ne peut être utilisé que pour déréférencer des propriétés.

#{...}est la syntaxe SpEL , qui est beaucoup plus performante et complexe. Il peut également gérer les espaces réservés de propriété, et bien plus encore.

Les deux sont valides et ni l'un ni l'autre n'est obsolète.

skaffman
la source
22
Afin d'accéder avec succès aux valeurs de propriété en utilisant la syntaxe SpEL, utilisez le format"#{'${property}'}"
Brice Roncace
1
Re: commentaire ci-dessus - voir aussi cette réponse
Steve Chambers
8

${expr} -> Évaluation immédiate

#{expr} -> Évaluation différée

Une évaluation immédiate signifie que l'expression est évaluée et le résultat renvoyé dès que la page est rendue pour la première fois. L'évaluation différée signifie que la technologie utilisant le langage d'expression peut utiliser sa propre machinerie pour évaluer l'expression un peu plus tard au cours du cycle de vie de la page, chaque fois que cela est approprié.

Référence complète ici

Il n'y a pas de JSP EL, JSP utilise SpEL. SpEL s'adapte à la technologie qui l'utilise.

XvrCJ
la source
6
Vous parlez d'une technologie Web Java EE tandis que la question portait sur la configuration de printemps utilisant Spring ELs. Et puis, JSP n'utilise pas SpEL, vous n'avez même pas besoin de Spring pour exécuter des JSP
gregfqt
3
La dernière déclaration sur le JSP utilisant SpEL est purement fausse.
Michal M
2
Pour clarifier encore plus: JSP à partir de la version 2.1. prend en charge Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html qui a servi de modèle pour SpEL. Extrait du document Spring: «Le Spring Expression Language (SpEL en abrégé) est un langage d'expression puissant qui prend en charge l'interrogation et la manipulation d'un graphique d'objets au moment de l'exécution. La syntaxe du langage est similaire à Unified EL mais offre des fonctionnalités supplémentaires, notamment l'invocation de méthode et de base fonctionnalité de création de modèles de chaînes. "
Fritz Duchardt
-1

Essayez de lire cet article , qui suggère

"Si le hachage est utilisé, votre code est recalculé chaque fois que cet élément est inclus dans une actualisation partielle (c'est-à-dire à chaque fois qu'il est rendu). Si vous utilisez un dollar, votre code n'est calculé que lorsque la page est chargée initialement. Mais ceci a été étendu au-delà du simple EL, à SSJS aussi. Après le hachage ou le dollar, les accolades indiquent le début et la fin de votre langue. Ce sera important lorsque nous en viendrons à combiner les langues plus tard. "

chrisp7575
la source
13
Aucun de n'a rien à voir avec Spring EL, il parle de JSP EL.
skaffman
@skaffman: même si vous avez raison, bien sûr, c'est une info intéressante (du moins pour moi ...).
sjngm
Une autre réponse dit qu '"il n'y a pas de JSP EL, JSP utilise SpEL". Est-ce exact?
Carl G
1
Il existe un «langage d'expression» (EL) dans la spécification Java EE qui est destiné à être utilisé dans les JSP et par JSF. Cela n'a rien à voir avec Spring EL.
gregfqt
-4

Spécification du langage d'expression • Version finale - 8 mai 2006

Page 2:

Une eval-expression est formée en utilisant les constructions $ {expr} ou # {expr}. Les deux constructions sont analysées et évaluées exactement de la même manière par l'EL, même si elles peuvent avoir des significations différentes dans la technologie qui utilise l'EL.

Mellon
la source
2
À quelle partie de ma question est-ce censé répondre? Il date de 2006 et des mots comme «analysé et évalué exactement de la même manière» et «pourrait avoir des significations différentes» sont probablement aussi vagues que vous pouvez le dire.
sjngm