Статьи

Spring Property Placeholder Configurer — несколько не столь очевидных вариантов

PropertySourcesPlaceholderConfigurer Spring используется для вывода свойств из определений bean-компонентов Spring, определенных в XML, или с помощью Java Config. Есть несколько опций, которые поддерживает PlaceholderConfigurer, которые не очевидны из документации, но интересны и могут быть полезны.

Для начала, пример из документации Spring , рассмотрим файл свойств с информацией для настройки источника данных:

1
2
3
4
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

PropertySourcesPlaceholderConfigurer настраивается с использованием настраиваемого пространства имен:

1
<context:property-placeholder location='database.properties'/>

Компонент источника данных, использующий эти свойства, может быть определен с помощью определения компонента на основе XML следующим образом:

1
2
3
4
5
6
7
<bean id='dataSource' destroy-method='close'
    class='org.apache.commons.dbcp.BasicDataSource'>
  <property name='driverClassName' value='${jdbc.driverClassName}'/>
  <property name='url' value='${jdbc.url}'/>
  <property name='username' value='${jdbc.username}'/>
  <property name='password' value='${jdbc.password}'/>
</bean>

и используя конфигурацию на основе Java следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Value('${jdbc.driverClassName}') private String driverClassName;
@Value('${jdbc.url}')             private String dbUrl;
@Value('${jdbc.username}')        private String dbUserName;
@Value('${jdbc.password}')        private String dbPassword;
 
@Bean
public BasicDataSource dataSource() {
 BasicDataSource dataSource = new BasicDataSource();
 dataSource.setDriverClassName(driverClassName);
 dataSource.setUrl(dbUrl);
 dataSource.setUsername(dbUserName);
 dataSource.setPassword(dbPassword);
 return dataSource;
}

Не очень очевидные варианты:

Во-первых, это поддержка значений по умолчанию. Скажем, к примеру, если для имени пользователя jdbc по умолчанию должно быть указано sa, способ сделать это следующим образом (используя синтаксис $ {propertyName: default}):

1
<property name='username' value='${jdbc.username:sa}'/>

или с помощью Java Config:

1
2
3
4
5
6
7
8
..
..
@Value('${jdbc.username:sa}') private String dbUserName;
 
@Bean
public BasicDataSource dataSource() {
..
}

Во-вторых, это поддержка разрешения вложенных свойств, например, рассмотрим следующие свойства:

файл phase.properties —

1
2
3
phase=qa
jdbc.username.qa=qasa
jdbc.username.dev=devsa

и используя свойство ‘phase’ как часть другого свойства в определении bean-компонента XML следующим образом:

1
<property name='username' value='${jdbc.username.${phase}}'/>

Эти параметры могут быть очень полезны для конфигурации на основе заполнителя.

Ссылка: Spring Property Placeholder Configurer — Несколько не столь очевидных вариантов от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.