我有一个Spring bean:
<bean id="sharedBean" class="com.bean.SharedBean">
<constructor-arg name="app-name" value="#{ config['app.name'] }"/>
</bean>
此bean在jar中定义,并在两个应用程序中使用,这两个应用程序都部署到同一个tomcat服务器。我只有一个属性文件应用程序共享,我想尽可能保持这种方式。您可能会看到问题 - 我需要两个app.name值(每个Web应用一个)。
我需要在每个应用中独立设置app.name。我不介意在Java中对值进行硬编码(但不要认为我可以在该方向上注入值)。我知道我可以在不同的路径引入另一个属性文件并覆盖,但我希望有一个更好的方法可以通过Spring实现这一点,这将允许我只维护一个共享属性文件。
答案 0 :(得分:1)
可能的解决方案,建议顺序:
1 - 有没有理由在单独的jar文件中声明共享bean?当然,bean类可以位于那里,但是为什么不在使用它的各个web应用程序中声明实际的bean?
2 - 如果您绝对需要将bean定义保留在共享jar中,则可以使用bean inheritance; (a)将您的bean类更改为使用属性而不是构造函数arg:
<bean id="sharedBean" class="com.bean.SharedBean">
<property name="app-name" value="default"/>
</bean>
(b)在您的网络应用上下文文件中:
<bean id="instanceBean" parent="sharedBean">
<property name="app-name" value="app1"/>
</bean>
3 - 使用Spring配置文件;在您的共享jar context.xml中:
<beans profile="app1">
<bean id="sharedBean" class="com.bean.SharedBean">
<constructor-arg name="app-name" value="app1"/>
</bean>
</beans>
<beans profile="app2">
<bean id="sharedBean" class="com.bean.SharedBean">
<constructor-arg name="app-name" value="app2"/>
</bean>
</beans>
note: <beans profile=... MUST be the last entries in your context file.
为每个web.xml添加一个上下文参数(根据需要更改值):
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>app1</param-value>
</context-param>