【问题标题】:AOP: basic ideas - keep objects simple?AOP:基本思想——保持对象简单?
【发布时间】:2011-06-30 19:45:19
【问题描述】:

我使用 Spring Framework 3.0.5,我想了解 Spring 的基本原理。其中之一是 AOP。

spring 框架的一个基本思想是保持对象本身的简单性和清晰的代码。

DI 遵循这个基本思想。它提供了清晰的代码,并且对象本身可以非常简单。不必查找他们的依赖项。

现在关于 AOP 呢:我的意思是,使用 AOP 代码肯定会更清晰,但是 AOP 是否也有保持对象尽可能简单的基本思想?我不确定,这就是为什么我想知道其他一些意见:-)

提前致谢!

【问题讨论】:

    标签: java spring dependency-injection aop


    【解决方案1】:

    AOP 的主要动机是将其用于所谓的横切关注点,就像您需要在应用程序的基本上所有部分中提供的功能一样,通常包括:

    • 日志记录
    • 身份验证
    • 审核
    • 事务性。

    AOP 允许您将这些功能提取到单独的类中,并标记需要这些功能的类。

    观看this 精彩视频以了解主要思想。要回答你的问题,是的,这对保持你的类的整洁有很大帮助,因为它们只会关心自己的功能,而不必一遍又一遍地提供样板代码。

    【讨论】:

      【解决方案2】:

      以下面的代码sn-ps为例。 简单方式:

      @PersistenceContext
      private EntityManager em;
      
      @Transactional
      public void save(Object obj) {
          em.persist(obj);
      }
      

      传统的方式(你可以使用EntityManager接口管理事务,但这不是重点):

      @PersistenceContext
      private EntityManager em;
      
      @Resource
      private AbstractPlatformTransactionManager transactionManager;
      
      public void save(final Object obj) {
          new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() {
              @Override
              protected void doInTransactionWithoutResult(TransactionStatus status)
              {
                  em.persist(obj);
              }
          });
      }
      

      它与 AOP 有什么关系?事务管理是 AOP 使用最广泛的示例之一,Spring 也不例外。前者代码 sn-p 使用@Transactional 注解使用方面应用事务划分,而后者则手动管理事务。看到好处了吗?

      关键是:使用切面处理横切关注点,如日志记录、分析等。不要在切面中构建业务逻辑。这样一来,您的 bean 就保持清晰,而从业务角度来看不相关的代码隐藏在方面。

      AOP 还允许您轻松完成各种复杂的工作。以 HTTP 会话处理为例 - 使用 session bean 范围和 AOP 代理,您甚至可以在没有意识到的情况下访问会话。

      总而言之 - 当用于正确的工作时,它是一个很好的工具。

      【讨论】:

      • 谢谢你!但是...您会说使用 aop 可以使对象保持“简单”吗? (我的意思是,像 POJO 和 DI 一样的简单方法 - 我不确定 AOP 是否想要相同的......?)
      • 是的,AOP 使您的对象简单没有样板和基础设施。这就是我的示例的重点:让您的对象保持简单和集中,而不太重要和不相关的细节在方面中隐藏。另一方面,方面也很简单,因为它们遵循单一责任原则
      • 谢谢。 AOP 如此简单意味着“没有样板和基础设施”。你会说这与 DI 想要实现的目标相同吗?我认为它具有可比性但不一样
      • 我想说:DI 提高了可测试性,使您的代码更易于维护和理解,而 AOP 减少了重复并提高了一致性。这两种技术都可以简化代码,但这不是他们的目标,而是重要的副作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2012-06-13
      相关资源
      最近更新 更多