如何使Spring应用程序的业务逻辑用户可配置?

时间:2014-03-05 17:28:39

标签: java spring customization

我是一名开发基于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>

2 个答案:

答案 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,我们需要回收服务器以进行更改。