Главная » Spring » Подстановка переменных-заполнителей Spring

0

В версиях Spring ниже 2.5 для настройки механизма подстанов- ки переменных-заполнителей в определении контекста Spring не- обходимо было объявить компонент PropertyPlaceholderConfigurer. Хотя это было совсем несложно, тем не менее начиная с версии Spring 2.5 эта процедура была упрощена еще больше добавлением нового элемента <context:property-placeholder> в конфигурационное пространство имен context. Теперь механизм подстановки перемен- ных-заполнителей можно настраивать так:

<context:property-placeholder location="classpath:/db.properties"   />

Согласно этим настройкам, механизм подстановки переменных- заполнителей будет извлекать значения свойств из файла с именем db.properties, находящимся в корневом каталоге библиотеки клас- сов (classpath). Но его точно так же можно было бы настроить на извлечение значений свойств из файла, находящегося в файловой системе:

<context:property-placeholder location="file:///etc/db.properties"      />

Что касается содержимого файла db.properties, он должен хранить (как минимум) значения свойств компонента DriverManagerDataSource:

jdbc.driverClassName=org.hsqldb.jdbcDriver jdbc.url=jdbc:hsqldb:hsql://localhost/spitter/spitter jdbc.username=spitterAdmin

jdbc.password=t0ps3cr3t

Теперь можно заменить значения, объявленные в конфигурации Spring,  переменными-заполнителями,  опираясь  на  определения в  файле  db.properties:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" p:driverClassName="${jdbc.driverClassName}"

p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

Возможно, кому-то важно будет знать, что область применения механизма подстановки переменных-заполнителей не ограничивает- ся свойствами компонентов, определяемых в XML-файле. Его мож- но также использовать для настройки свойств, отмеченных аннота- цией @Value. Например, если в программном коде имеется опреде- ление компонента, требующего настройки JDBC URL, в аннотации

@Value можно использовать переменную-заполнитель ${jdbc.url}, как показано ниже:

@Value("${jdbc.url}") String   databaseUrl;

Более того, переменные-заполнители можно использовать даже в самом файле с определениями свойств. Например, значение свой- ства jdbc.url можно определить с помощью переменных-заполните- лей, чтобы разбить это определение на несколько частей:

jdbc.protocol=hsqldb:hsql db.server=localhost db.name=spitter

jdbc.url=jdbc:${jdbc.protocol}://${db.server}/${db.name}/${db.name}

Здесь я определил три свойства, jdbc.protocol, db.server и db.name. А также четвертое свойство, использующее три других для конст- руирования URL базы данных.

Выше были описаны основы механизма подстановки переменных- заполнителей в Spring. Но на этом его возможности не ограничива- ются. В первую очередь посмотрим, как справиться с переменными- заполнителями в свойствах, определение которых отсутствует.

Подстановка отсутствующих значений

Что произойдет, если переменная-заполнитель не определена в файле свойств? Или, хуже того, атрибут location указывает на не- существующий файл свойств?

В подобных ситуациях во время загрузки контекста Spring и соз- дания компонентов по умолчанию будет возбуждено исключение. Однако существует возможность избежать появления исключения, определив в элементе <context:property-placeholder> атрибуты ignore- resource-not-found     и   ignore-unresolvable:

<context:property-placeholder location="file:///etc/myconfig.properties" ignore-resource-not-found="true"

ignore-unresolvable="true"

properties-ref="defaultConfiguration"/>

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

Но если переменные-заполнители не будут замещены какими-то значениями, разве это хорошо? В конце концов, значение ${jdbc. url} не может использоваться для доступа к базе данных. Это недо- пустимый JDBC URL.

Было бы гораздо лучше иметь возможность внедрять значения по умолчанию вместо бесполезных переменных-заполнителей. Такую возможность обеспечивает атрибут properties-ref. В этом атрибуте определяется идентификатор компонента java.util.Properties, со- держащего значения свойств по умолчанию. Ниже приводится эле- мент <util:properties>, определяющий значения по умолчанию для свойств, имеющих отношение к базе данных:

<util:properties  id="defaultConfiguration">

<prop         key="jdbc.url">jdbc:hsqldb:hsql://localhost/spitter/spitter</prop>

<prop   key="jdbc.driverClassName">org.hsqldb.jdbcDriver</prop>

<prop     key="jdbc.username">spitterAdmin</prop>

<prop  key="jdbc.password">t0ps3cr3t</prop>

</util:properties>

Если теперь какая-либо из переменных-заполнителей не будет найдена в файле db.properties, на ее место будет подставлено значе- ние по умолчанию, объявленное в компоненте defaultConfiguration.

Определение  значений  переменных-заполнителей из системных свойств

К настоящему моменту мы видели, как определять значение пере- менных-заполнителей в файле свойств и в элементе <util:properties>.

Однако существует возможность получать значения этих перемен- ных из системных свойств. Для этого достаточно определить атрибут system-properties-mode в компоненте <component:property-placeholder>. Например:

<context:property-placeholder location="file:///etc/myconfig.properties" ignore-resource-not-found="true"

ignore-unresolvable="true" properties-ref="defaultConfiguration" system-properties-mode="OVERRIDE"/>

Значение OVERRIDE в атрибуте system-properties-mode указывает, что элемент <component:property-placeholder> должен отдавать предпочтение системным свойствам, а не определениям свойств в файле db.properties или в компоненте defaultConfiguration. Значение OVERRIDE – это одно из трех возможных значений в атрибуте system-properties-mode:

# FALLBACK – значения для переменных-заполнителей извлека-

ются из системных свойств, только если они не определены в файле свойств;

# NEVER – никогда не извлекать значения для переменных-запол-

нителей из системных свойств;

# OVERRIDE – отдавать предпочтение системным свойствам при разрешении переменных-заполнителей.

По умолчанию элемент <component:property-placeholder> будет пытаться получить значения переменных-заполнителей из файла свойств и в случае неудачи использовать системные свойства, как при значении FALLBACK в атрибуте system-properties-mode.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии