2010-02-10 53 views
2

以Web用户为单位对每个用户进行交换实现说一个Web应用程序是一个中央支付处理引擎,其中每个用户可能有一个不同的信用卡提供商来处理信用卡。如何使用Spring的DI

有一个接口,所有的实现遵守。

我想知道是否有规律可循的,你可以让新的实现在部署文件夹(.jar文件)简单地下降,而无需重新编译应用程序。您至多不得不进入管理部分并输入关于新信用卡实施的一些详细信息。

示例:假定应用程序当前支持Authorize.net。所以所有用户都使用authorize.net。现在我编写一个新的实现并删除.jar文件,进入管理员并注册新的信用卡提供商。

现在用户可以登录到系统,并选择使用新的实现。

这可能做不必重新编译? 春天的DI会派上用场吗?

回答

3

你所描述的听起来比起“基本的”Spring bean容器机制更适合OSGi。通常,应用程序启动并运行后,Spring ApplicationContext不会更改。相比之下,OSGi专为这种运行时动态行为而设计,可以与Spring结合使用。看看Spring Dynamic Modules文档,了解它的工作原理。

2

我建议你看看java.util.ServiceLoader,它允许你为接口实现做一个'查找',它在运行时动态添加到类路径中。基本上,服务jar必须包含一个叫做/META-INF/services/some.package.InterfaceName的文本文件,它包含一个类的列表,它实现了指定的接口。

然而,没有标准化的方式来扩展正在运行的Web应用程序的类路径(如在J2EE Web应用程序中那样),所以根据您的servlet容器,您可能必须在将新JAR添加到部署目录后重新启动Web应用程序。

+0

+1对于'ServiceLoader' – skaffman 2010-02-10 16:45:34

0

@Rob H为OSGi提供了一个很好的选择,因为它本身就支持你想要做的事情。

另一种不会引入新技术的选择是将支付方法委托给其他Java EE应用程序,然后可以独立于中央支付处理引擎启动,添加或更新这些应用程序。管理员可以轻松将新的付款方式映射到适当的应用程序。