Spring Expression Language (SpEL) com @Value: dólar x hash ($ x #)

126

Estou um pouco confuso sobre quando usar em ${...}comparação com #{...}. A documentação do Spring usa apenas #{...}, mas existem muitos exemplos ${...}. Além disso, quando comecei com o SpEL, fui solicitado a usar ${...}e ele funciona bem.

Para quem está confuso, um exemplo de como eu o uso seria

@Component
public class ProxyConfiguration {

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

    :
}

e algum arquivo de propriedades:

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

Minhas perguntas são:

  • quais são as diferenças ou é a mesma coisa?
  • é uma versão preterida, então devo usar a outra?
sjngm
fonte

Respostas:

139

${...}é a sintaxe do espaço reservado para propriedade. Só pode ser usado para desreferenciar propriedades.

#{...}é a sintaxe SpEL , que é muito mais capaz e complexa. Ele também pode lidar com espaços reservados de propriedades e muito mais.

Ambos são válidos e nenhum deles foi preterido.

skaffman
fonte
22
A fim de valores de propriedade de acesso com sucesso usando a sintaxe SPEL, utilize o formato"#{'${property}'}"
Brice Roncace
1
Re: comentário acima - veja também esta resposta #
315 Steve Chambers
8

${expr} -> Avaliação imediata

#{expr} -> Avaliação diferida

Avaliação imediata significa que a expressão é avaliada e o resultado retornado assim que a página é renderizada pela primeira vez. Avaliação adiada significa que a tecnologia que usa a linguagem de expressão pode usar seu próprio mecanismo para avaliar a expressão algum tempo depois durante o ciclo de vida da página, sempre que for apropriado.

Referência completa aqui

Não há JSP EL, o JSP usa SpEL. O SpEL se encaixa na tecnologia que está sendo usada.

XvrCJ
fonte
6
Você está falando de uma tecnologia da web Java EE enquanto a pergunta era sobre a configuração da primavera usando o Spring ELs. E, em seguida, JSP não usar SPEL, você não precisa mesmo de Primavera para executar JSPs
gregfqt
3
A última declaração no JSP usando SpEL está totalmente errada.
Michal H
2
Para esclarecer ainda mais: JSP a partir da versão 2.1. suporta o EL unificado docs.oracle.com/javaee/5/tutorial/doc/bnahq.html, que serviu como modelo para o SpEL. Da documentação do Spring: "O Spring Expression Language (SpEL, abreviado) é uma linguagem de expressão poderosa que oferece suporte à consulta e manipulação de um gráfico de objetos em tempo de execução. A sintaxe da linguagem é semelhante ao EL Unificado, mas oferece recursos adicionais, principalmente invocação de métodos e recursos básicos. funcionalidade de modelagem de string. "
Fritz Duchardt
-1

Tente ler este artigo , que sugere

"Se o hash for usado, seu código será recalculado toda vez que esse elemento for incluído em uma atualização parcial (ou seja, toda vez que for renderizado). Se você usar um dólar, seu código será computado apenas quando a página for carregada inicialmente. Mas isso foi estendido para além do EL, também para o SSJS. Após o hash ou o dólar, os chavetas indicam o início e o fim do seu idioma. Isso será importante quando chegarmos à combinação de idiomas posteriormente. "

chrisp7575
fonte
13
Nada disso tem algo a ver com o Spring EL, está falando sobre JSP EL.
precisa
@skaffman: mesmo que você esteja certo, é claro, é uma informação interessante (pelo menos para mim ...).
sjngm
Outra resposta diz que "não existe JSP EL, o JSP usa SpEL". Isso está correto?
Carl G
1
Há uma "Expression Language" (EL) na especificação Java EE que deve ser usada em JSPs e pelo JSF. Não tem nada a ver com o Spring EL.
gregfqt
-4

Especificação do idioma da expressão • Versão final - 8 de maio de 2006

Página 2:

Uma expressão de avaliação é formada usando as construções $ {expr} ou # {expr}. Ambas as construções são analisadas e avaliadas exatamente da mesma maneira pelo EL, mesmo que possam ter significados diferentes na tecnologia que está usando o EL.

Mellon
fonte
2
Que parte da minha pergunta isso deve responder? É de 2006 e palavras como "analisadas e avaliadas exatamente da mesma maneira" e "podem ter significados diferentes" são provavelmente tão vagas quanto você provavelmente pode colocá-las.
sjngm