【问题标题】:Do AOP violate layered architecture for enterprise apps?AOP 是否违反了企业应用程序的分层架构?
【发布时间】:2012-06-07 08:11:02
【问题描述】:
这个问题(如标题中所述)出现在我面前,因为最近我正在研究带有注释支持的 Spring MVC 3.1,并且还在为即将到来的项目考虑 DDD。在新的 Spring 中,任何 POJO 及其业务方法都可以被注释为控制器,我在 Controller 类中解决的所有问题都可以通过注释来表达。
所以,从技术上讲,我可以使用任何类并将其连接为控制器,java 代码不受任何控制器特定代码的影响,因此 java 代码可以处理诸如检查安全性、启动 txn 等事情。这样的类属于表示层还是应用层??
更进一步,我们可以提取安全性、txn mgmt 之类的内容并通过注释来表达它们,因此 java 代码现在是域对象的代码。这是否意味着我们已经将 2 层融合在一起了?请澄清
【问题讨论】:
标签:
spring-mvc
aop
n-tier-architecture
【解决方案1】:
您不能将任何 POJO 用作控制器。控制器的工作是从浏览器获取输入,调用服务,为视图准备模型,并返回视图以进行调度。它仍然是一个控制器。不是通过 XML 和方法覆盖来配置它,而是通过注释来配置它,仅此而已。
代码与任何控制器特定代码相去甚远。它仍然使用ModelAndView、BindingResult等。
【解决方案2】:
我将接近问题的标题,关于 AOP:
AOP 不违反“分层架构”,特别是因为根据定义,它正在添加应用程序范围的功能无论该功能正在使用的层。规范的 AOP 示例是日志记录:不是层,而是一个功能——所有层都进行日志记录。
要将 AOP 与您的问题联系起来,请考虑事务管理,这可以通过 Spring 的 AOP 机制处理。 “事务”本身并不特定于任何层,尽管任何给定的应用程序可能只需要仅在单个层中的事务。在这种情况下,AOP 不会违反分层架构,因为它只应用于单个层。
在事务可能跨层的应用程序中,IMO 它仍然不违反任何分层原则,因为 事务的实际位置并不真正相关:重要的是“这块功能必须是事务性的”。即使该事务跨越多个应用程序边界。
事实上,我会说在这种情况下使用 AOP 会特别保留 层,因为 TX 代码不会在所有这些层中机械地复制,并且没有任何一层需要怀疑( a) 如果它在事务上下文中被调用,或者 (b) 它在哪个事务上下文中。