Загрузка значений свойств Бина из context.xml

В настоящее время мы загружаем исходные значения JDBC из файла свойств следующим образом:

<context:property-placeholder location="classpath:master.properties" ignore-unresolvable="true" />

<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource"
    destroy-method="close">
    <property name="driverClass" value="${database.driver}" />
    <property name="jdbcUrl" value="${database.url}" />
    <property name="username" value="${database.user}" />
    <property name="password" value="${database.password}" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="idleMaxAge" value="240" />
    <property name="maxConnectionsPerPartition" value="2" />
    <property name="minConnectionsPerPartition" value="2" />
    <property name="partitionCount" value="3" />
    <property name="acquireIncrement" value="10" />
    <property name="statementsCacheSize" value="50" />
    <property name="releaseHelperThreads" value="3" />
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"
    scope="singleton">
    <property name="targetDataSource">
        <ref local="mainDataSource" />
    </property>
</bean>

Это сег. отлично работает с файлом app.properties на основе classpath и избавляется от app.properties.

Мы хотели бы загрузить эти значения из context.xml (либо помещены в META-INF или же $CATALINA_HOME/conf/context.xml). Это поможет нам загрузить правильные значения на серверах prod/staging.

Буду признателен за любую помощь или альтернативный метод / предложения. (Если на аналогичный вопрос уже дан ответ, поделитесь ссылкой) Спасибо!

3 ответа

Решение

Как упомянул Алан Хей, вы можете перенести конфигурацию источника данных в собственный context.xml Tomcat, а затем заставить Spring выполнить поиск JNDI для его получения. Этот подход я обычно использовал в некоторых проектах, над которыми работал.

Куски, которые вам нужно поставить на место, будут:

1. Добавьте конфигурацию источника данных в $ CATALINA_HOME / conf / context.xml

<GlobalNamingResources>

    <Resource type="javax.sql.DataSource" 
              name="dsName"
              factory="com.jolbox.bonecp.BoneCPDataSource" 
              driverClassName="your.driver.classname"
              jdbcUrl="your:driver:url" 
              username="username"
              password="password" 
              idleMaxAge="240" 
              idleConnectionTestPeriod="60"
              partitionCount="3" 
              acquireIncrement="10" 
              maxConnectionsPerPartition="2"
              minConnectionsPerPartition="2" 
              statementsCacheSize="50"
              releaseHelperThreads="3" />

</GlobalNamingResources>

2. Добавьте ссылку на ресурс в META-INF/context.xml приложения.

<Context path="/YourApp">
    <ResourceLink description="Datasource for YourApp" 
                  global="jdbc/dsName"
                  name="jdbc/dsName" 
                  type="javax.sql.DataSource" />        
</Context>

3. Измените конфигурацию Spring для поиска источника данных в JNDI

<beans xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/jee classpath:/org/springframework/ejb/config/spring-jee-3.0.xsd">

    <jee:jndi-lookup id="dataSource" 
                     jndi-name="java:comp/env/jdbc/dsName" />

4. Переместите банки с драйверами и источниками данных.

Поскольку конфигурация источника данных теперь управляется контейнером, вы должны поместить драйвер базы данных и jar источника данных в $CATALINA_HOME/lib, чтобы они были доступны для Tomcat при создании источника данных. Эти банки больше не должны находиться в WEB-INF/lib вашего приложения.

Как я это делаю, у меня есть файл свойств по умолчанию в моем classpath, и у меня есть один файл свойств, который я использую для переопределения этих свойств по умолчанию (разработка):

в моем весеннем файле:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="ignoreResourceNotFound" value="true"/>
      <property name="locations">
        <list>
            <value>classpath:jdbc.properties</value>
            <value>classpath:camel.properties</value>
            <value>classpath:email.properties</value>
            <value>${external_config}</value>
        </list>
    </property>
</bean>

В разработке я использую файл свойств в classpath.
При различных обстоятельствах, постановке, интеграции, производстве мы запускаем приложение со следующим параметром:

-Dexternal_config=file:c:/staging.properties

Таким образом, у меня одна и та же сборка для всех сред и я могу выбрать расположение моего файла переопределенных свойств.

Так, ${external_config} является заполнителем для файла конфигурации, который зависит от среды. Spring ищет переменную среды с именем external_config, которая должна указывать на файл конфигурации. Если файл не найден, Spring игнорирует его с помощью ignoreResourceNotFound = true;

В Spring 3.1 появилась поддержка профилей, специфичных для среды. Определите некоторые профили, свяжите их с некоторыми файлами свойств, например, test.properties, live.properties и установите переменную среды при запуске сервера -Dspring.profiles.active=Test. Чисто и просто.

http://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/

Другой вариант, о котором говорилось выше, состоит в том, чтобы перейти к управляемому контейнером пулу подключений, который ищется через JNDI, то есть определить источник данных JNDI с именем xyz одинаковым на каждом сервере, а затем:

Другие вопросы по тегам