春季将演示和业务层分开

时间:2020-03-06 14:53:27  来源:igfitidea点击:

在我刚刚完成的项目中,我正在努力使分布式事务正常运行。

我们使用JBoss的Arjuna Transaction Manager和Spring的声明式事务边界实现了这一点。

我们的请求顺序如下:

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

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

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

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

我想知道其他人在使用Spring时提出什么建议来分离层?

解决方案

仅为立面的SLSB要求EJB3应用服务器似乎对我来说不值得。没有理由不能只删除它,而让servlet直接与Spring一起工作。我们可以将ContextLoaderListener添加到WAR中以加载ApplicationContext,然后将其添加到WebApplicationContextUtils中。另外,如果我们需要做的比Servlet本身所能做的更多,则可以使用SpringMVC,Struts或者其他Web技术。

一个非常典型的方法是定义一个Web层,一个服务层和一个DAO层,并将事务语义添加到该服务层。例如,服务层可能是一堆带有@Transactional批注的POJO。 Web层可能是Spring Web MVC控制器。在这种方法中,Web层实质上是使服务层适应HTTP。良好的分离性,此处无需SLSB。

但是,有关领域对象(例如Employee或者PurchaseOrder或者其他)的争论领域之一。这些跨越应用程序层,并且批注似乎正在发生的一件事是,域对象获得绑定到特定层的批注。因此,我们可能在此处具有ORM批注,但随后使用与表单支持bean相同的域对象作为避免并行域/表单对象类的方法。有人反对这样做,因为这违反了关注点的架构分离。