java - 在 Spring 之上开发基于插件的架构

标签 java spring plugins architecture servlet-filters

我一直在为我当前的一个应用程序在 Spring 之上开发一个简单的基于插件的架构而绞尽脑汁。无论使用像 MVC 这样的模式可以实现多少分离,总是会达到耦合不可避免的地步。

因此,我开始权衡各种选择。起初我认为过滤器是个好东西。我制作的每个插件都是一个过滤器,然后我将简单地将其插入到过滤器映射中。当然,这会在枚举和检查所有过滤器时产生一些开销,但至少, Controller 不必关心数据到达之前发生了什么,或者之后发生了什么,他们只关心获取模型(通过 DAO 或诸如此类)并返回它们。

问题在于并非我所有的应用程序请求都是基于 HTTP 的。有些基于电子邮件,有些是内部安排的(定时),所以过滤器不会有太大帮助,除非我尝试将每种类型的传入请求调整为 HTTPRequest,这会太多。

我想到的另一个是基于注释的 AOP,我在其中注释每个方法,插件将根据某些约定拦截方法。我的问题是,首先我对一般的 AOP 不太熟悉,其次,简单地编写所有这些约定已经暗示了一些耦合

到目前为止,最符合我的想法的选项是使用基于 Spring 的事件。我的应用程序中的每种类型的请求处理程序(Web Controller 、电子邮件处理程序等)都将是一种事件调度程序,它将在每个主要操作上调度 Spring 事件。另一方面,插件将简单地监听特定事件何时发生,并执行一些逻辑。这也将允许我利用第 1 点,因为其中一些插件也可以是过滤器,即当他们收到某个 Controller 操作已完成的通知时,他们可能只是决定什么都不做,而是等待何时他们被过滤器链调用。我认为这是一种不错的方法。当然,开销又来了,调度事件,加上每个涉及的类都将永远与 Spring 耦合的事实,但我认为这是不可避免的。

我对 Spring 事件的主要关注是性能,包括延迟和内存占用。

我仍然不是专家,所以这里的一堆反馈会很有帮助。 spring events 是最适合这种类型的架构,还是我错过了另一种解决方案?我知道甚至可能已经有一些第三方解决方案了,所以如果有人能指出一两个经过尝试和验证的解决方案,我会很高兴。

谢谢。

最佳答案

插件的概念可以用Spring bean工厂来实现。如果您创建一个公共(public)接口(interface),您可以定义多个实现它的 bean 并在需要的地方注入(inject)它们。或者您可以使用 factorybean 为工作提供正确的插件。

您使用事件的想法称为“事件驱动架构”。这不仅仅是插件,因为它不仅与实现分离,而且还提供了与使用哪个实例(多个处理程序)、哪个位置(多台机器)和处理请求的时间(异步)分离的可能性处理)。权衡是整体复杂性增加,组件级复杂性降低以及对消息传递基础设施的需求。通常使用 JMS,但如果您只想要单节点设置,则同时使用 Spring 和 Mule还提供简单的内存模式。

为了进一步帮助您,您应该稍微扩展一下您要满足的要求和您想要的架构改进。到目前为止,您已经提到您想要使用插件并描述了一些可能的解决方案,但您还没有真正描述您想要实现的目标。

关于java - 在 Spring 之上开发基于插件的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413785/

相关文章:

java - 处理私有(private)方法(白盒测试),具有许多条件的方法

html - 用于自动创建 CSS 类的 SUblimeText2 插件?

java - 重用 Eclipse 的插件 list 编辑器

java - fragment 集可见性空指针

java - 线程在从空 DataInputStream 读取 UTF 时卡住

java - Camel ProducerTemplate 未注入(inject)注释配置

java - 未定义 [javax.persistence.EntityManagerFactory] ​​类型的合格 bean"}}

ios - 通过 LAN 在 Lightroom 插件和 iOS 应用程序之间进行通信

java - 如何在 foreach keySet() 中获取两个不同的键?

JAVA - 通过链表过滤