我正在设计 Spring Web 应用程序(我使用 Spring MVC)遵循插件架构。每个插件(插件是一个 jar 文件)及其组件(控制器、服务、POJO、..)都将包含在每个 ApplicationContext 中,每当我禁用该插件(通过关闭其 ApplicationContext)时,用户将收到一条消息说“The特性或功能不可用”。当我再次刷新插件的 ApplicationContext 时,该插件将再次可用,并且用户可以访问该插件的功能。插件不相互依赖,它只依赖于核心模块。但是在 Spring 中,只有子上下文可以看到父上下文,反之亦然。由于 Spring 的这种限制,我有一些其他的想法来实现它,如下所示:
1/ 我创建了一个注解@Plugin 来标记该插件的包并使用AOP 来拦截用户访问。每当禁用插件时,用户就无法访问该插件的服务/控制器,并且将引发异常以在网页上通知用户。
2/ 不支持在运行时禁用插件。服务器需要停止,我们必须删除该 jar 文件才能从 Web 应用程序中卸载该插件
3/ 创建一个 channing ApplicationContext,它将在许多 ApplicationContext 中查找 bean 或组件,并将这个用于 DispatcherServlet。
有人可以给我一些建议吗?我应该使用以上哪个想法或不使用它们?我想开发一个 Web 应用程序,我们可以在运行时安装/卸载插件而无需重新启动服务器。
谢谢