我是一名开发基于Spring框架的Java Web应用程序的开发人员。 该应用程序将部署到几个不同的客户。 有一个类包含一些针对每个客户端不同的业务逻辑。 从Spring框架的角度来看,只需为每个客户端连接适当的类(作为bean)即可。
但是,开发人员不负责部署应用程序。运营团队负责,让他们打开WAR文件并修改每个客户端部署的弹簧配置XML可能要求他们过多。属性文件没问题,但修改内部文件 - 可能不是。
有没有其他人提出处理这个问题的策略?
编辑:
举一个我正在谈论的例子:
public interface IEngine {
void makeNoise();
}
public class Car {
public void setEngine(IEngine engine) {
this.engine = engine;
}
}
客户A的业务逻辑:
HeavyDutyEngine implements IEngine {
public void makeNoise() {
System.out.println("VROOOM!");
}
}
客户B的业务逻辑:
LightWeightEngine implements IEngine {
public void makeNoise() {
System.out.println("putputput");
}
}
在Spring配置XML中:
对于客户端A,它可能如下所示:
<bean id="hdEngine" class="HeavyDutyEngine" />
<bean id="lwEngine" class="LightWeightEngine" />
<bean id="car" class="Car">
<property name="engine" ref="hdDngine">
</bean>
对于客户B,它可能如下所示:
<bean id="hdEngine" class="HeavyDutyEngine" />
<bean id="lwEngine" class="LightWeightEngine" />
<bean id="car" class="Car">
<property name="engine" ref="lwEngine">
</bean>
答案 0 :(得分:1)
要为不同的环境配置Spring,您可以使用名为spring“profiles”的概念。 (在春季3.1中介绍)
您有不同的方式,因此启用/禁用此属性。例如java properties参数。 但是因为你正在使用WAR,因此使用一些Servlet容器,我建议将这个配置放在Servlet容器中。
例如,在tomcat中,您可以将此行放在context.xml
(全局或特定于应用程序)中以启用配置文件
<Parameter name="spring.profiles.active" value="myProfile"/>
答案 1 :(得分:0)
如果您使用的话,可以将某些配置移动到DB。
你可以使用这样的东西
ref="{ref-name}"
通过配置ref-name
,可以使用属性文件(默认)解析PropertyPlaceholderConfigurer
。
或者您可以在PropertyPlaceholderConfigurer
上编写自己的包装器,它将从您可部署的WAR文件外部的DB表中获取值。
在我的一个项目中,我们使用此方法来解析自定义依赖项。查找DB的包装器用于获取优先级,如果DB没有键/值对,则使用属性文件(捆绑在WAR中)来解析依赖关系。
这也允许您从DB外部更改某些值,但是对于IBM Websphere,我们需要回收服务器以进行更改。