Java 如何使用Spring的DI在web应用程序上按用户交换实现

Java 如何使用Spring的DI在web应用程序上按用户交换实现,java,spring,plugin-architecture,Java,Spring,Plugin Architecture,假设一个web应用程序是一个中央支付处理引擎,每个用户可能有一个不同的信用卡提供商来处理信用卡 所有实现都遵循一个接口 我想知道是否有一种模式,您可以允许将新的实现简单地放到部署文件夹.jar文件中,而无需重新编译应用程序。您最多只能进入管理部分,输入有关新信用卡实施的一些详细信息 示例:假设应用程序当前支持Authorize.net。因此,所有用户都在使用authorize.net。现在,我编写了一个新的实现,并删除.jar文件,进入管理员界面,注册新的信用卡提供商 现在用户可以登录到系统,并

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

所有实现都遵循一个接口

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

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

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

这是否可以在不需要重新编译的情况下执行?
spring的DI对此有用吗?

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

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


但是,在J2EE web应用程序中,没有标准化的方法来扩展正在运行的web应用程序的类路径,因此,根据servlet容器的不同,您可能必须在向部署目录添加新JAR后重新启动web应用程序。

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

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