【问题标题】: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 层融合在一起了?请澄清

【问题讨论】:

  • AOP 和这个有什么关系?

标签: spring-mvc aop n-tier-architecture


【解决方案1】:

您不能将任何 POJO 用作控制器。控制器的工作是从浏览器获取输入,调用服务,为视图准备模型,并返回视图以进行调度。它仍然是一个控制器。不是通过 XML 和方法覆盖来配置它,而是通过注释来配置它,仅此而已。

代码与任何控制器特定代码相去甚远。它仍然使用ModelAndView、BindingResult等。

【讨论】:

    【解决方案2】:

    我将接近问题的标题,关于 AOP:

    AOP 不违反“分层架构”,特别是因为根据定义,它正在添加应用程序范围的功能无论该功能正在使用的层。规范的 AOP 示例是日志记录:不是层,而是一个功能——所有层都进行日志记录。

    要将 AOP 与您的问题联系起来,请考虑事务管理,这可以通过 Spring 的 AOP 机制处理。 “事务”本身并不特定于任何层,尽管任何给定的应用程序可能只需要仅在单个层中的事务。在这种情况下,AOP 不会违反分层架构,因为它只应用于单个层。

    在事务可能跨层的应用程序中,IMO 它仍然不违反任何分层原则,因为 事务的实际位置并不真正相关:重要的是“这块功能必须是事务性的”。即使该事务跨越多个应用程序边界。

    事实上,我会说在这种情况下使用 AOP 会特别保留 层,因为 TX 代码不会在所有这些层中机械地复制,并且没有任何一层需要怀疑( a) 如果它在事务上下文中被调用,或者 (b) 它在哪个事务上下文中。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2021-06-19
      • 2011-05-23
      • 1970-01-01
      • 2012-04-01
      相关资源
      最近更新 更多