Spring Expression Language (SpEL) с @Value: доллар против хэша ($ против #)


126

Я немного не понимаю, когда использовать ${...}по сравнению с #{...}. В документации Spring используется только #{...}, но есть много примеров, которые используют ${...}. Более того, когда я начал с SpEL, мне сказали использовать, ${...}и он работает нормально.

Для тех, кто сбит с толку, пример того, как я его использую, будет

@Component
public class ProxyConfiguration {

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

    :
}

и некоторый файл свойств:

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

Мои вопросы:

  • в чем отличия или он одинаковый?
  • одна версия устарела, поэтому я должен использовать другую?

Ответы:


140

${...}- синтаксис заполнителя свойства. Его можно использовать только для разыменования свойств.

#{...}- это синтаксис SpEL , который гораздо более эффективен и сложен. Он также может обрабатывать заполнители свойств и многое другое.

Оба действительны, и ни один из них не устарел.


22
Для успешного доступа к значениям свойств с использованием синтаксиса SpEL используйте формат"#{'${property}'}"
Брис Ронкаче,

1
Re: комментарий выше - также см. Этот ответ
Стив Чемберс

8

${expr} -> Немедленная оценка

#{expr} -> Отложенная оценка

Немедленная оценка означает, что выражение оценивается и результат возвращается, как только страница сначала отображается. Отложенная оценка означает, что технология, использующая язык выражений, может использовать свой собственный механизм для оценки выражения позже, в течение жизненного цикла страницы, когда это необходимо.

Полная ссылка здесь

JSP EL нет, JSP использует SpEL. SpEL подходит для технологий, которые его используют.


6
Вы говорите о веб-технологии Java EE, а вопрос касался конфигурации Spring с использованием Spring EL. Кроме того, JSP не использует SpEL, вам даже не нужен Spring для запуска JSP
gregfqt

3
Последнее утверждение о JSP, использующем SpEL, совершенно неверно.
Michal M

2
Для дальнейшего уточнения: JSP версии 2.1. поддерживает Unified EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html, который служил шаблоном для SpEL. Из документа Spring: «Spring Expression Language (сокращенно SpEL) - это мощный язык выражений, который поддерживает запросы и манипулирование графом объектов во время выполнения. Синтаксис языка аналогичен Unified EL, но предлагает дополнительные функции, в первую очередь вызов методов и базовый строковые шаблоны ".
Fritz Duchardt

-1

Попробуйте прочитать эту статью , в которой предлагается

«Если используется хэш, ваш код пересчитывается каждый раз, когда этот элемент включается в частичное обновление (т. Е. Каждый раз, когда он отображается). Если вы используете доллар, ваш код вычисляется только при начальной загрузке страницы. Но это был расширен не только на EL, но и на SSJS. После решетки или доллара фигурные скобки обозначают начало и конец вашего языка. Это будет важно, когда мы перейдем к объединению языков позже ».


13
Ничего из этого не имеет отношения к Spring EL, речь идет о JSP EL.
skaffman

@skaffman: хоть ты и прав, конечно, это интересная информация (по крайней мере, для меня ...).
sjngm

Другой ответ гласит, что «JSP EL не существует, JSP использует SpEL». Это правильно?
Carl G

1
В спецификации Java EE есть «язык выражений» (EL), который предназначен для использования в JSP и JSF. Это не имеет ничего общего с Spring EL.
gregfqt

-4

Спецификация языка выражений • Окончательный выпуск - 8 мая 2006 г.

Страница 2:

Выражение eval формируется с использованием конструкций $ {expr} или # {expr}. Обе конструкции анализируются и оцениваются EL одинаково, даже если они могут иметь разное значение в технологии, использующей EL.


2
На какую часть моего вопроса это должен ответить? Это из 2006 года, и такие слова, как «анализируются и оцениваются точно так же» и «могут иметь разные значения», вероятно, настолько расплывчаты, насколько вы можете это сказать.
sjngm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.