春季物业整合

时间:2014-09-08 16:45:30

标签: java spring

我有一个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实现这一点,这将允许我只维护一个共享属性文件。

1 个答案:

答案 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>