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.