Статьи

Конфигурирование через JNDI в Spring Framework

С определенного момента приложение должно быть настраиваемым. 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"?>
 
  <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 .