Translate

вівторок, 12 березня 2013 р.

Spring Expression Language (SpEL)


Spring пропонує шикарні можливості для декларатовного опису параметрів, а вершиною можливостей є Spring Expression Language. По суті, це потужня мова, що надає динаміку до конфігурування бінів, у тому числі можливість працювати графом об"єктів під час виконання. Хто знайомий з OGNL - то це дуже подібно і вшито в спрінг контекст.

Найпростіший приклад: припустимо, ви маєте проперті файл у якому даєте можливість корисутвачу задавати якийсь інтервал часу в годинах (тобто з точки зору користвувача мінімальний крок в налаштуваннях є година), але самі в коді потребуєте секунди, можна інджектати це ось таким чином:
 
<bean class="com.blogspot.jug-lviv.Test" id="test">
  <property name="testField" value="#{${time.interval.hours}*60*60}">
</property></bean>

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

Ви пишет клас що реалізую інтерфейс:

 
interface PathUtil {
   String getRealPath(String relativePath);
}
і тепер у вашій спрінг конфігурації ви можете писати, отримуючи одразу абсолютний шлях інджектнутим в бін:
 
<bean class="com.blogspot.jug-lviv.Test" id="test">
  <property name="testField" 
    value="#{ T(com.blogspot.jug-lviv.PathUtilImpl).getRealPath(${metrics.storage}) }">
</property></bean>

Ну і варіант з інджектанням дефолтного значення, коли воно не доступне серед пропертів:

 
<bean class="com.blogspot.jug-lviv.Test" id="test">
  <property name="topGrade" 
        value="#{${top.grade} == null ? '100' : ${top.grade} }}">
</property></bean>

Всі зазначені праиклади працюють також для конфігурацій через анотації.
Більше читаємо тут http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch07.html