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

use*_*232 5 java architecture plugins spring servlet-filters

对于我目前的一个应用程序,我一直在为Spring开发基于插件的简单体系结构而烦恼不已.无论使用像MVC这样的模式可以实现多少分离,总会达到耦合不可避免的程度.

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

这个问题是我的所有app请求都不是基于HTTP的.有些是基于电子邮件,有些则是内部安排的(定时),因此过滤器不会有太大帮助,除非我尝试将每种类型的传入请求调整为HTTPRequest,这太过分了.

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

到目前为止,主要吸引我的思维方式的选项是使用基于Spring的事件.我的应用程序中的每种类型的请求处理程序(Web控制器,电子邮件处理程序等)都将是一种事件调度程序,它将在每个主要操作上调度Spring事件.另一方面,插件将只是监听特定事件发生的时间,并做一些逻辑.这也允许我使用#1点,因为其中一些插件也可以是过滤器,即当他们收到某个控制器动作完成的通知时,他们可能只是决定什么都不做,而是等待什么时候它们被过滤链调用.我认为这是一个不错的方法.当然,这里还有调整事件的开销,以及每个涉及的类将永远与Spring结合的事实,但我认为这是一个必要的邪恶.

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

我仍然不是专家,所以这里的一堆反馈会有很大的帮助.春季活动对于这种类型的建筑来说是最好的,还是有另一种我错过的解决方案?我知道甚至可能会有一些第三方解决方案,所以如果有人能指出一两个经过验证的解决方案,我会很高兴.

谢谢.

Adr*_*ter 1

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

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

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