在Tomcat中将配置与WAR分离的优雅方法

Nig*_*gel 20 java configuration spring tomcat

我试图找到在Tomcat中运行的Spring webapp中传递复杂配置的最佳方法.目前,我使用JNDI将数据源和字符串从Tomcat上下文传递到webapp,这很有效.

但是,让我说我需要选择通知服务的实现.Spring无法有条件地选择实例化哪个bean(尽管在过去我使用JNDI字符串通过设置contextConfigLocation来导入预定义的bean配置).

我还看到很多webapps提供了一个配置工具,它将创建一个自定义WAR文件.在我看来,这是一种糟糕的形式,如果没有其他原因,它会阻止从上游重新部署WAR而不进行多次检查,以确保所有配置都已重新应用.

理想情况下,我可以在webapp之外提供存在于文件系统上的Spring XML文件.但是,spring import指令似乎没有解决$ {}变量,因此无法提供自定义.

我是否可以使用任何技术将复杂配置与webapp正确分开?

can*_*iru 12

如果我有一组特定的bean我想配置,并且此配置必须与WAR文件分开,我通常会执行以下操作:

applicationContext.xml中:

<!-- here you have a configurer based on a *.properties file -->
<bean id="configurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="file://${configDir}/configuration.properties"/>
    <property name="ignoreResourceNotFound" value="false" />
    <property name="ignoreUnresolvablePlaceholders" value="false" />
    <property name="searchSystemEnvironment" value="false" />
</bean>

<!-- this is how you can use configuration properties -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${smtp.host}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

configuration.properties中:

smtp.host=smtp.your-isp.com
Run Code Online (Sandbox Code Playgroud)

您还需要使用-DconfigDir =/path/to/configuration /目录启动Tomcat

  • 使用属性文件的`classpath:`URI是不是"优雅",所以你可以把它放在类路径的某个地方,避免摆弄Tomcat的启动参数? (3认同)