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

126

Estoy un poco confundido acerca de cuándo usar en ${...}comparación con #{...}. La documentación de Spring solo usa #{...}, pero hay muchos ejemplos que usan ${...}. Además, cuando comencé con SpEL me dijeron que lo usara ${...}y funciona bien.

Para aquellos que están confundidos, un ejemplo de cómo lo uso sería

@Component
public class ProxyConfiguration {

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

    :
}

y algún archivo de propiedades:

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

Mis preguntas son:

  • ¿Cuáles son las diferencias o es lo mismo?
  • ¿una versión está en desuso por lo que debería usar la otra?
sjngm
fuente

Respuestas:

139

${...}es la sintaxis del marcador de posición de propiedad. Solo se puede usar para desreferenciar propiedades.

#{...}es la sintaxis SpEL , que es mucho más capaz y compleja. También puede manejar marcadores de posición de propiedad, y mucho más además.

Ambos son válidos y ninguno está en desuso.

skaffman
fuente
22
Para acceder con éxito a los valores de propiedad utilizando la sintaxis SpEL, use el formato"#{'${property}'}"
Brice Roncace,
1
Re: comentar arriba - también ver esta respuesta
Steve Chambers
8

${expr} -> Evaluación inmediata

#{expr} -> Evaluación diferida

La evaluación inmediata significa que se evalúa la expresión y se devuelve el resultado tan pronto como se procesa la página. La evaluación diferida significa que la tecnología que usa el lenguaje de expresión puede usar su propia maquinaria para evaluar la expresión en algún momento posterior durante el ciclo de vida de la página, siempre que sea apropiado hacerlo.

Referencia completa aquí

No hay JSP EL, JSP usa SpEL. SpEL se adapta a la tecnología que lo está utilizando.

XvrCJ
fuente
66
Estás hablando de una tecnología web Java EE mientras que la pregunta era sobre Spring Config usando Spring ELs. Y luego, JSP no usa SpEL, ni siquiera necesita Spring para ejecutar JSPs
gregfqt
3
La última declaración sobre el JSP que usa SpEL es puramente errónea.
Michal M
2
Para aclarar aún más: JSP a partir de la versión 2.1. es compatible con Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html que sirvió como plantilla para SpEL. Del documento de Spring: "El lenguaje de expresión de Spring (SpEL para abreviar) es un poderoso lenguaje de expresión que admite la consulta y la manipulación de un gráfico de objeto en tiempo de ejecución. La sintaxis del lenguaje es similar a Unified EL pero ofrece características adicionales, sobre todo la invocación de métodos y básicos funcionalidad de plantilla de cadena ".
Fritz Duchardt
-1

Intenta leer este artículo , que sugiere

"Si se usa el hash, su código se vuelve a calcular cada vez que se incluye ese elemento en una actualización parcial (es decir, cada vez que se procesa). Si usa un dólar, su código solo se computa cuando la página se carga inicialmente. Pero esto se ha extendido más allá de EL, también a SSJS. Después del hash o el dólar, las llaves indican el comienzo y el final de su idioma. Esto será importante cuando comencemos a combinar idiomas más adelante ".

chrisp7575
fuente
13
Ninguno de los dos tiene nada que ver con Spring EL, está hablando de JSP EL.
skaffman
@skaffman: aunque tengas razón, por supuesto, es una información interesante (al menos para mí ...).
sjngm
Otra respuesta dice que "no hay JSP EL, JSP usa SpEL". ¿Es eso correcto?
Carl G
1
Hay un "Lenguaje de expresión" (EL) en la especificación Java EE que debe usarse en JSP y JSF. No tiene nada que ver con Spring EL.
gregfqt
-4

Especificación del lenguaje de expresión • Versión final - 8 de mayo de 2006

Página 2:

Una expresión eval se forma usando las construcciones $ {expr} o # {expr}. Ambas construcciones son analizadas y evaluadas exactamente de la misma manera por el EL, aunque pueden tener diferentes significados en la tecnología que está utilizando el EL.

Mellon
fuente
2
¿Qué parte de mi pregunta se supone que responde? Es de 2006 y las palabras como "analizadas y evaluadas exactamente de la misma manera" y "podrían tener diferentes significados" son probablemente tan vagas como probablemente puedas decirlo.
sjngm