1. Обзор
Из этого туториала вы узнаете, как настроить и использовать свойства в Spring — с помощью конфигурации XML или Java.
До Spring 3.1 добавление новых файлов свойств в Spring и использование значений свойств не было настолько гибким и надежным, как могло бы быть. Начиная с Spring 3.1 , новые абстракции Environment и PropertySource значительно упрощают этот процесс.
2. Регистрация свойств через пространство имен XML
Используя XML, новые файлы свойств могут быть сделаны доступными для Spring через следующий элемент пространства имен:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation=" < context:property-placeholder location = "classpath:foo.properties" /> </ beans > |
Файл foo.properties должен быть помещен в / src / main / resources, чтобы он был доступен в пути к классам во время выполнения.
2.1. Несколько <property-placeholder>
Если в контексте Spring присутствуют несколько элементов <property-placeholder> , следует придерживаться нескольких рекомендаций:
- атрибут порядка должен быть указан, чтобы исправить порядок, в котором они обрабатываются Spring
- все заполнители свойств минус последний (самый высокий порядок ) должны иметь значение ignore-unresolvable = ”true”, чтобы механизм разрешения мог передавать другим в контексте без исключения
3. Регистрация свойств через аннотации Java
Spring 3.1 также представляет новую аннотацию @PropertySource как удобный механизм добавления источников свойств в среду. Эта аннотация должна использоваться вместе с конфигурацией на основе Java и аннотацией @Configuration :
1
2
3
4
5
6
7
8
9
|
@Configuration @PropertySource ( "classpath:foo.properties" ) public class PropertiesWithJavaConfig { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } } |
В отличие от использования элемента пространства имен XML, аннотация Java @PropertySource не регистрирует PropertySourcesPlaceholderConfigurer автоматически в Spring . Вместо этого компонент должен быть явно определен в конфигурации, чтобы механизм разрешения свойств работал. Причиной этого неожиданного поведения является дизайн и задокументированы по этому вопросу .
4. Использование свойств
И старый PropertyPlaceholderConfigurer, и новый PropertySourcesPlaceholderConfigurer, добавленные в Spring 3.1, разрешают заполнители $ {…} в значениях свойств определения компонента и аннотациях @Value .
Например, чтобы добавить свойство с помощью аннотации @Value :
1
2
|
@Value ( "${jdbc.url}" ) private String jdbcUrl; |
Также можно указать значение по умолчанию для свойства :
1
2
|
@Value ( "${jdbc.url:aDefaultUrl}" ) private String jdbcUrl; |
Использование свойств в конфигурации Spring XML:
1
2
3
|
< bean id = "dataSource" > < property name = "url" value = "${jdbc.url}" /> </ bean > |
И, наконец, получение свойств через новые API среды:
1
2
3
4
|
@Autowired private Environment env; ... dataSource.setUrl(env.getProperty( "jdbc.url" )); |
Здесь очень важно предостеречь о том, что использование <property-placeholder> не будет предоставлять свойства Spring Environment — это означает, что получение значения, подобного этому, не будет работать — оно вернет null :
1
|
env.getProperty( "key.something" ) |
4.1 Свойства Поиск Приоритет
По умолчанию в Spring 3.1 локальные свойства являются последними в поиске после всех источников свойств среды, включая файлы свойств. Это поведение может быть переопределено через свойство localOverride свойства PropertySourcesPlaceholderConfigurer , для которого можно установить значение true, чтобы локальные свойства могли переопределять свойства файла.
В Spring 3.0 и более ранних версиях старый PropertyPlaceholderConfigurer также пытался искать свойства как в источниках, определенных вручную, так и в свойствах System. Приоритет поиска также можно настраивать с помощью свойства systemPropertiesMode в конфигураторе:
- никогда — никогда не проверяйте свойства системы
- отступление (по умолчанию) — проверка системных свойств, если они не разрешены в указанных файлах свойств
- override — сначала проверьте системные свойства, прежде чем пытаться указывать файлы свойств. Это позволяет системным свойствам переопределять любой другой источник свойств.
Наконец, обратите внимание, что в случае, если свойство определено в двух или более файлах, определенных с помощью @PropertySource — последнее определение победит и переопределит предыдущие . Это затрудняет прогнозирование точного значения свойства, поэтому, если переопределение важно, вместо него можно использовать API-интерфейс PropertySource.
5. За кулисами — конфигурация пружины
5.1. До весны 3.1
В Spring 3.1 появилась удобная опция определения источников свойств с помощью аннотаций, но до этого для этого была необходима конфигурация XML.
XML-элемент <context: property-placeholder> автоматически регистрирует новый bean-компонент PropertyPlaceholderConfigurer в контексте Spring. Для обратной совместимости это также имеет место в Spring 3.1, если схемы XSD еще не обновлены, чтобы указывать на новые версии XSD 3.1.
5.2. После весны 3.1
Начиная с Spring 3.1, XML <context: property-placeholder> больше не будет регистрировать старый PropertyPlaceholderConfigurer, а только что представленный PropertySourcesPlaceholderConfigurer . Этот замещающий класс был создан, чтобы быть более гибким и лучше взаимодействовать с недавно введенным механизмом Environment и PropertySource .
Для приложений, использующих Spring 3.1 или выше, это должно считаться стандартом.
6. Конфигурирование с использованием Raw Beans в Spring 3.0 — PropertyPlaceholderConfigurer
Помимо удобных методов получения свойств в Spring — аннотации и пространство имен XML — компонент конфигурации свойств также может быть определен и зарегистрирован вручную . Работа с PropertyPlaceholderConfigurer дает нам полный контроль над конфигурацией, а недостаток в том, чтобы быть более подробным и в большинстве случаев ненужным.
6.1. Конфигурация Java
1
2
3
4
5
6
7
8
9
|
@Bean public static PropertyPlaceholderConfigurer properties(){ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); Resource[] resources = new ClassPathResource[ ] { new ClassPathResource( "foo.properties" ) }; ppc.setLocations( resources ); ppc.setIgnoreUnresolvablePlaceholders( true ); return ppc; } |
6.2. Конфигурация XML
1
2
3
4
5
6
7
8
|
< bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > < property name = "locations" > < list > < value >classpath:foo.properties</ value > </ list > </ property > < property name = "ignoreUnresolvablePlaceholders" value = "true" /> </ bean > |
7. Конфигурация с использованием Raw Beans в Spring 3.1 — PropertySourcesPlaceholderConfigurer
Аналогично, в Spring 3.1 новый PropertySourcesPlaceholderConfigurer также можно настроить вручную:
7.1. Конфигурация Java
01
02
03
04
05
06
07
08
09
10
|
@Bean public static PropertySourcesPlaceholderConfigurer properties(){ PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); Resource[] resources = new ClassPathResource[ ] { new ClassPathResource( "foo.properties" ) }; pspc.setLocations( resources ); pspc.setIgnoreUnresolvablePlaceholders( true ); return pspc; } |
7.2. Конфигурация XML
1
2
3
4
5
6
7
8
|
< bean class = "org.springframework.context.support.PropertySourcesPlaceholderConfigurer" > < property name = "location" > < list > < value >classpath:foo.properties</ value > </ list > </ property > < property name = "ignoreUnresolvablePlaceholders" value = "true" /> </ bean > |
8. Заключение
В этой статье показано несколько примеров работы со свойствами и файлами свойств в Spring , а также обсуждены более старые параметры Spring 3.0, а также новая поддержка свойств, представленная в Spring 3.1.
Реализацию всех примеров регистрации файлов свойств и использования значений свойств можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.