基于上下文路径的外部配置

时间:2010-11-19 04:00:29

标签: spring tomcat

我想在不同的上下文路径下在同一个tomcat服务器上部署特定Web应用程序的多个独立副本。每个网络应用程序都需要不同的配置设置(数据库名称,密码等),但我希望保持战争完全相同。

我的计划是让应用程序在启动时找出其上下文路径,然后读取由上下文路径标识的tomcat之外的特定.properties文件。例如,如果将战争部署到{tomcat path} / webapps / pineapple,那么我想阅读/config/pineapple.properties

我一直试图通过spring(3)找到一种注入ServletContext实例的方法,但到目前为止我看到的所有建议都使用了弃用的ServletContextFactoryBean。

是否有更好的方法来注入上下文路径或更好地根据上下文路径加载外部文件?

3 个答案:

答案 0 :(得分:5)

ServletContextAttributeFactoryBean和Spring EL的帮助下,您可以像这样引用ServletContext init参数(<context-param>在web.xml中):

#{contextAttributes.myKey}

这允许您使用PropertyPlaceHolderConfigurer并从用户定义的任意位置加载属性文件:

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="#{contextParameters.APP_HOME}/conf/app.properties"/>
</bean>

Tomcat的context.xml中的ServletContext init参数的相应定义:

<Parameter name="APP_HOME" value="file:/test" override="false"/>

或者在你的应用的web.xml中:

<context-param>
    <param-name>APP_HOME</param-name>
    <param-value>file:/test</param-value>
</context-param> 

答案 1 :(得分:4)

这应该是解决方案。

<bean name="envConfig" class="EnvironmentConfiguration">
     <property name="locations">
    <list>
        <value>file:///#{servletContext.contextPath}.properties</value>
    </list>
     </property>
     <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

答案 2 :(得分:1)

  1. 扩展Propertyplaceholderconfigurer以使用DB来获取值。示例here
  2. 将设置的实际值(数据库名称,密码等)作为种子数据的一部分加载到数据库
  3. 初始化您的网络应用程序的应用程序ctx时,将从数据库中解析属性
  4. 这是我们一直遵循的方法并且效果很好。如果您可以切换到Spring 3.1,那么它支持Environment Profiles,这可能对您有用。