С определенного момента приложение должно быть настраиваемым. Spring Framework имеет хороший вспомогательный инструмент для этой проблемы, начиная с первой версии 0.9, класса PropertyPlaceholderConfigurer и начиная с Spring Framework 3.1 класса PropertySourcesPlaceholderConfigurer. Когда вы начнете поиск Google для PropertyPlaceholderConfigurer, вы найдете много примеров, когда элементы конфигурации сохраняются в файлах свойств. Но во многих корпоративных приложениях Java, как правило, элементы конфигурации загружаются через поиск JNDI . Я хотел бы продемонстрировать, как PropertyPlaceholderConfigurer (до Spring Framework 3.1) и, соответственно, PropertySourcesPlaceholderConfigurer (начиная с Spring Framework 3.1) могут помочь облегчить настройку JNDI в нашем приложении.
Исходная ситуация
У нас есть веб-приложение, которое имеет соединение с базой данных. Это соединение с базой данных должно быть настраиваемым. Элементы конфигурации определены в файле контекста веб-приложения.
context.xml
|
1
2
3
4
5
|
<Context docBase="/opt/tomcat/warfiles/jndi-sample-war.war" antiResourceLocking="true"> <Environment name="username" value="demo" type="java.lang.String" override="false"/> <Environment name="password" value="demo" type="java.lang.String" override="false"/> url" value="jdbc:mysql://localhost:3306/wicket_demo" type="java.lang.String" override="false"/></Context> |
Для загрузки этих элементов конфигурации используется механизм поиска JNDI.
В нашем приложении мы определяем компонент источника данных в XML-файле контекста Spring. Этот компонент представляет соединение с базой данных.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <!--<span class="hiddenSpellError" pre="" data-mce-bogus="1"-->bean></beans> |
Каждое значение, которое начинается и заканчивается $ {}, должно быть заменено PropertyPlaceholderConfigurer и, соответственно, PropertySourcesPlaceholderConfigurer во время запуска приложения. Следующим шагом является настройка PropertyPlaceholderConfigurer и, соответственно, PropertySourcesPlaceholderConfigurer.
До Spring Framework 3.1 — Настройка PropertyPlaceholderConfigurer для поиска JNDI
Мы определяем bean-компонент PropertyPlaceholderConfigurer в XML-файле контекста Spring. Этот компонент содержит внутренний компонент, который отображает имена свойств компонента источника данных на соответствующее имя JNDI. Имя JNDI состоит из двух частей. Первая часть — это имя контекста, в котором находится ресурс (в нашем случае java: comp / env / ), а вторая часть — это имя ресурса (в нашем случае это имя пользователя, пароль или URL).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties"> <bean class="java.util.Properties"> <constructor-arg> <map> <entry key="username"> <jee:jndi-lookup jndi-name="java:comp/env/username" /> </entry> <entry key="password"> <jee:jndi-lookup jndi-name="java:comp/env/password" /> </entry> <entry key="url"> <jee:jndi-lookup jndi-name="java:comp/env/url" /> </entry> </map> </constructor-arg> </bean> </property></bean> |
Начиная с Spring Framework 3.1 — PropertySourcesPlaceholderConfigurer, настроенный для поиска JNDI
С весны 3.1 вместо PropertyPlaceholderConfigurer следует использовать PropertySourcesPlaceholderConfigurer. Это приводит к тому, что начиная с Spring 3.1 элемент пространства имен <context: property-placeholder /> регистрирует экземпляр PropertySourcesPlaceholderConfigurer (определение пространства имен должно быть spring-context-3.1.xsd) вместо PropertyPlaceholderConfigurer (вы можете смоделировать старое поведение при использовании определение пространства имен spring-context-3.0.xsd). Таким образом, наша конфигурация контекста Spring XML очень коротка, когда вы соблюдаете некоторые соглашения (основанные на принципе « Соглашение над конфигурацией»).
|
1
|
<context:property-placeholder/> |
Поведение по умолчанию состоит в том, что PropertySourcesPlaceholderConfigurer перебирает набор PropertySource для сбора всех значений свойств. Этот набор содержит JndiPropertySource по умолчанию в веб-приложении на основе Spring. По умолчанию JndiPropertySource ищет имена ресурсов JNDI с префиксом java: comp / env . Это означает, что если ваше свойство равно $ {url} , соответствующее имя ресурса JNDI должно быть java: comp / env / url .
- Исходный код примера веб-приложения размещен на GitHub .
| Ссылка: | Конфигурирование через JNDI в Spring Framework от нашего партнера JCG Сандры Парсик в блоге SKM IT WORLD . |