2

假设 Web 应用程序是一个中央支付处理引擎,其中每个用户可能有不同的信用卡提供商来处理信用卡。

有一个所有实现都遵循的接口。

我想知道是否存在一种模式,您可以允许将新实现简单地放入部署文件夹(.jar 文件)中,而无需重新编译应用程序。最多您必须进入管理部分并输入有关新信用卡实施的一些详细信息。

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

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

这可能不需要重新编译吗?spring 的 DI 会为此派上用场吗?

4

3 回答 3

3

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

于 2010-02-10T16:38:47.040 回答
2

我建议您看一下java.util.ServiceLoader,它允许您对接口实现进行“查找”,这些实现在运行时动态添加到类路径中。基本上,服务 jar 必须简单地包含一个名为 /META-INF/services/some.package.InterfaceName 的文本文件,其中包含实现指定接口的类列表。

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

于 2010-02-10T16:38:55.560 回答
0

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

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

于 2010-02-10T18:42:58.603 回答