4

在我刚刚完成的项目中,我正在努力让分布式事务正常工作。

我们使用 JBoss 的 Arjuna 事务管理器和 Spring 的声明性事务边界来实现这一点。

我们的请求序列如下所示:

browser -> secured servlet -> 'wafer-thin' SLSB -> spring TX-aware proxy -> request-handler POJO

这意味着我们有一个 WAR 服务于我们的安全 servlet 和一个 EAR 服务于我们的 SLSB。

我们的 SLSB 有一个静态初始化块来引导我们的 Spring 应用程序上下文。

我不喜欢技术的混合,但我喜欢表示层和业务层的分离,它们可以驻留在不同的物理位置。

我很想知道其他人在使用 Spring 时建议将层分开吗?

4

2 回答 2

2

只为作为外观的 SLSB 需要 EJB3 应用程序服务器对我来说似乎不值得付出努力。您没有理由不能直接删除它并让您的 servlet 直接与 Spring 一起工作。您可以将 ContextLoaderListener 添加到 WAR 以加载您的 ApplicationContext,然后添加 WebApplicationContextUtils 以获取它。或者,如果您需要做的事情超出了 Servlet 本身所允许的范围,您可以使用 SpringMVC、Struts 或其他 Web 技术。

于 2008-12-17T03:37:38.470 回答
2

一种非常典型的方法是定义 Web 层、服务层和 DAO 层,并将事务语义附加到服务层。例如,服务层可能是一堆带有 @Transactional 注释的 POJO。Web 层可能是 Spring Web MVC 控制器。在这种方法中,Web 层本质上是使服务层适应 HTTP。良好的分离,这里不需要 SLSB。

然而,一个争论的领域是关于域对象,如 Employee 或 PurchaseOrder 或其他。这些跨应用程序层和似乎与注释一起发生的一件事是域对象获得与特定层相关的注释。因此,您可能在此处使用 ORM 注释,然后使用相同的域对象作为表单支持 bean,以避免并行域/表单对象类。有些人反对这违反了架构上的关注点分离。

于 2008-12-17T04:06:56.037 回答