我有一个 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 中硬编码值(但不认为我可以在那个方向注入(inject)值)。我知道我可以在不同的路径引入另一个属性文件并覆盖,但我希望有一种更好的方法可以通过 Spring 实现这一点,这将允许我只维护一个共享属性文件。
最佳答案
可能的解决方案,按推荐顺序:
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>
关于java - Spring 属性(property)整合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729133/