Мова весняних виразів (SpEL) з @Value: долар проти хешу ($ проти #)


126

Я трохи розгублений щодо того, коли використовувати в ${...}порівнянні з #{...}. Документація весни використовує лише документацію #{...}, але є багато прикладів ${...}. Крім того, коли я почав працювати зі SpEL, мені сказали використовувати, ${...}і він прекрасно працює.

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

@Component
public class ProxyConfiguration {

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

    :
}

і деякий файл властивостей:

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

Мої запитання:

  • які відмінності чи це однаково?
  • одна версія застаріла, тому я повинен використовувати іншу?

Відповіді:


139

${...}є синтаксисом заповнення властивості. Він може використовуватися лише для властивостей деребачення.

#{...}є синтаксисом SpEL , який є набагато більш здатним та складним. Він також може обробляти власників місць, а також багато іншого.

Обидва є дійсними, і жодне не застаріле.


22
Щоб успішно отримати доступ до значень властивостей за допомогою синтаксису SpEL, використовуйте формат"#{'${property}'}"
Brice Roncace

1
Re: коментар вище - також дивіться цю відповідь
Стів Чемберс

8

${expr} -> Негайна оцінка

#{expr} -> Відкладена оцінка

Негайна оцінка означає, що вираження оцінюється і результат повертається, як тільки сторінка вперше надається. Відкладене оцінювання означає, що технологія, що використовує мову вираження, може використовувати власну техніку для оцінки виразу десь пізніше протягом життєвого циклу сторінки, коли це доцільно.

Повна довідка тут

Не існує JSP EL, JSP використовує SpEL. SpEL підходить до технології, яка ним користується.


6
Ви говорите про веб-технологію Java EE, тоді як питання стосувалося весняної конфігурації з використанням Spring ELs. І тоді, JSP не використовують SpEL, вам навіть не потрібна Spring для запуску JSP
gregfqt

3
Останнє твердження про JSP із використанням SpEL є чисто помилковим.
Міхал М

2
Для уточнення ще: JSP версії 2.1. підтримує Уніфікований EL docs.oracle.com/javaee/5/tutorial/doc/bnahq.html, який слугував шаблоном для SpEL. З документа Spring: "Мова експресії Spring (SpEL коротко) - це потужна мова виразів, яка підтримує запити та маніпулювання графіком об'єкта під час виконання. Синтаксис мови схожий на Unified EL, але пропонує додаткові функції, а саме: виклик методу та базовий функціональність шаблону рядків. "
Фріц Дюшардт

-1

Спробуйте прочитати цю статтю , яка підказує

"Якщо використовується хеш, ваш код перераховується щоразу, коли елемент включається в часткове оновлення (тобто щоразу, коли він надається). Якщо ви використовуєте долар, ваш код обчислюється лише тоді, коли сторінка спочатку завантажується. Але це було розширено за межі просто EL, і на SSJS. Після хешу або долара фігурні фігурні дужки позначають початок і кінець вашої мови. Це буде важливо, коли ми пізніше будемо поєднувати мови ".


13
Жоден з стосунків Spring EL не має нічого спільного, це мова про JSP EL.
скафман

@skaffman: хоча ти маєш рацію, звичайно, це цікава інформація (принаймні для мене ...).
sjngm

Інша відповідь говорить, що "немає JSP EL, JSP використовує SpEL". Це правильно?
Карл Г

1
У специфікації Java EE є "Мова виразів" (EL), яка призначена для використання в JSP та JSF. Це не має нічого спільного з Spring EL.
gregfqt

-4

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

Сторінка 2:

Еваль-вираз формується за допомогою конструктів $ {expr} або # {expr}. Обидві конструкції аналізуються та оцінюються ЕЛ точно так само, хоча вони можуть мати різні значення в технології, що використовує EL.


2
На яку частину мого запитання слід відповісти? Це з 2006 року, а слова на кшталт "розбираються та оцінюються абсолютно однаково" та "можуть нести різні значення" - це, мабуть, невиразно, напевно, ви можете це сказати.
sjngm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.