2

我是 Spring 新手,并试图找出处理以下情况的最佳方法:

我们有一个应用程序,用于本地开发和测试,所有配置值都从属性文件中提取。当应用程序部署到应用程序服务器(本例中为 Websphere)上时,我们使用 JNDI 资源属性而不是属性文件。

在 Spring 中是否有一种可接受的方式来处理这个问题?对于非 Spring 应用程序,我可能会使用一个好的 ol' 工厂模式来决定配置源。对于 Spring,我已经看到每个环境使用不同上下文 XML 文件的示例(听起来很乱),或者使用 Spring“配置文件”。

这种情况是否有普遍接受的做法?

4

3 回答 3

2

Spring 配置文件相当新,它们的添加正是为了解决您的问题。此外,他们应该弃用所有其他解决方法,例如您提到的不同上下文 XML 文件。

为了完整起见,这里是一个例子:

<beans profile="test">
  <context:property-placeholder location="/foo/bar/buzz.properties" />
</beans>
<beans profile="prd">
  <jee:jndi-lookup id="properties" jndi-name="foo/bar/name"/>
</beans>

根据您在部署/启动期间选择的配置文件,只会实例化上述 bean 之一。


我从未尝试过但似乎适合您的情况的另一种方法是命名空间中的default-value属性jee

<jee:jndi-lookup id="properties" jndi-name="foo/bar/name" resource-ref="true"
        default-value="classpath:foo.properties"/>

不确定这是否会对您有所帮助。

于 2013-01-12T20:30:03.070 回答
1

假设 Spring 3.1,尝试使用 Tomasz 建议的配置文件,但不要为生产设置单独的 JNDI 值,而是使用

<beans profile="prd">
  <context:property-placeholder/>
</beans>   

在 Spring 3.1 中,ContextLoaderListener 显然默认将 JNDI 道具作为 PropertySource 拉入,因此使用 property-placeholder,当您需要访问一个值时,您可以在 applicationContext.xml 或 @Value 注释中使用 ${some/jndi/name} .

要确保 webapp 从 JNDI 获取值,请添加

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prd</param-value>
</context-param>

到 web.xml。

在您的测试中,将系统属性“spring.profiles.active”设置为“test”,您将从 props 文件中获取值。

于 2013-01-13T19:18:52.487 回答
0

一种方法是您也将 jndi 用于本地开发和测试。您可以定义相同的 jndi 名称。我不知道你的测试服务器是什么,实际上我们使用 jetty 和 maven-jetty 插件进行测试。它是轻量级的,可以从您的 ide 运行。

另一种方式就像您在问题中所说的那样。使用 Spring 配置文件。然后你可以用相同的 id/name 声明不同的 transactionManager bean。当然,它们应该在不同的配置文件中。在运行时,您可以决定应该激活哪个配置文件,即应该使用哪个 bean。

于 2013-01-12T20:31:28.413 回答