我是Spring的新手,并试图找出处理以下场景的最佳方法:
我们有一个应用程序,在本地开发和测试中,所有配置值都从Properties文件中提取。当应用程序部署到App Server(在本例中为Websphere)时,我们使用JNDI资源属性而不是属性文件。
在Spring中是否有可接受的处理方法?对于非Spring应用程序,我可能会使用一个好的工厂模式来决定配置源。对于Spring,我看过每个环境使用不同上下文XML文件的例子(听起来很混乱),或者使用Spring“Profiles”。
这种情况是否有普遍接受的做法?
答案 0 :(得分: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"/>
不确定这是否会对您有所帮助。
答案 1 :(得分:1)
假设Spring 3.1,尝试使用像Tomasz建议的配置文件,但不是为生产设置单独的JNDI值,而是使用
<beans profile="prd">
<context:property-placeholder/>
</beans>
在Spring 3.1中,ContextLoaderListener显然默认将JNDI道具作为PropertySource引入,所以对于property-placeholder,当你需要访问一个值时,你可以在applicationContext.xml中使用$ {some / jndi / name}或者@Value注释。
要确保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文件中获取值。
答案 2 :(得分:0)
一种方法是将jndi用于本地开发和测试。您可以定义相同的jndi名称。我不知道你的测试服务器是什么,实际上我们使用jetty和maven-jetty插件进行测试。它很轻巧,可以从你的ide运行。
另一种方式就像你在问题中说的那样。利用Spring配置文件。然后,您可以声明具有相同ID /名称的不同transactionManager bean。当然他们应该有不同的档案。在运行时,您可以决定应该激活哪个配置文件,即应该使用哪个bean。