【问题标题】:Understanding Spring AOP [closed]了解 Spring AOP [关闭]
【发布时间】:2011-04-08 00:58:45
【问题描述】:

我正在使用 Spring 3.0 框架,但还是个新手。谁能用外行的术语解释一下什么是 AOP 编程? (一个简短的例子肯定会有所帮助)

Spring 如何整合/增强/支持它?

【问题讨论】:

  • 看看Spring's manuals,他们真的很棒(老实说!)
  • 我试图阅读文章、手册和论坛来理解 AOP,但是我对所有模糊的术语和抽象的语言感到困惑(我的小脑袋在试图处理这些术语时停止了工作)跨度>
  • Spring in Action, 第三版manning.com/walls4 很好地解释了使用 Spring 进行面向方面编程。
  • 我建议您按照本教程从理论到代码示例:Understanding Spring AOP
  • 查看这篇文章:marcin-chwedczuk.github.io/…

标签: java spring aop aspectj


【解决方案1】:

AOP 是一种修改代码库中现有类以修饰它们或根据单独定义的规则改变它们的行为的方法。此修改可以在将类放入 jar/war 之前完成,也可以在加载代码时动态进行。

这个想法是,不是在源代码中找到所有要修改的代码点并手动修改它们,而是定义如何在代码库中找到感兴趣点的规则,以及你想要什么样的修饰对他们做。这些规则称为方面(AOPA)。

原型示例是您想要获取代码库中各种方法的一些时间信息。您可以找到所有感兴趣的方法,并在顶部调用

long start = System.currentTimeMillis();

最后做

long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));

但那是:

  1. 可能是一堆工作
  2. 临时的,你不想弄乱你的代码库

您可以改为定义方面,说明您想要修改哪些方法,以及您想要在这些方法的开头和结尾处做些什么。

AOP 被应用时,无论是在创建 jar 时,还是在类加载时,就好像你最初是这样写的。

【讨论】:

  • 这确实很有帮助。您能否提供任何有用的链接/文章,这些链接/文章对像我这样的初学者非常有用且易于理解?
  • 不幸的是,似乎开发/宣传 AOP 的人倾向于将其视为比常规编程更高层次的抽象,因此以相对高雅的方式呈现材料,充满新意术语和过于复杂的言辞。我环顾四周寻找样本,这与我能找到的“只做这个”练习非常接近。它可能比大多数人更容易理解:andrewewhite.net/wordpress/2010/03/17/… 这绝不是接近完整的,但可能会让你尝尝。
【解决方案2】:

AOP 是一种用于模块化横切特征的模式。因此,如果某个“事物”适用于代码中的重要部分,那么您可以使用 AOP 来解决该问题。这些“事物”称为方面。

以下示例:

在整个企业应用程序中使用异常记录器。因此,您可以通过以下方式使用 AOP 进行设置。所以现在 my.service 包下的所有方法都将按以下方式记录。

  <bean id="exceptionLogger" class="my.good.ExceptionLogger" />  
        <aop:config>
                <aop:pointcut id="allServiceMethods" expression="execution(* my.service.*(..))" />
                <aop:aspect id="serviceLogger" ref="exceptionLogger">
                    <aop:after-throwing pointcut-ref="allServiceMethods"
                                        method="logIt"
                                        throwing="e"/>
                </aop:aspect>  
        </aop:config>

ExceptionLogger 类可能如下所示:-

public class ExceptionLogger {
    private static Logger logger = Logger.getLogger(ExceptionLogger.class);
    public void logIt(JoinPoint jp, Exception e) {
        StringBuilder msg = new StringBuilder();
        msg.append("<whatever makes sense>");
        logger.error(msg.toString());
    }
}

也看看这个相关的问题:-

  1. What is the most common use for AOP in spring project

【讨论】:

  • 'AOP 是一种用于模块化横切特征的模式。'你能解释一下这个说法吗?你所说的横切特征是什么意思?您能否提供任何有用的链接/文章来解释这一点?谢谢
  • 他的帖子中提到的日志记录、事务管理、计时(如@MeBigFatGuy)是横切的好例子。因为这些通常适用于所有方法。因此,您不必一遍又一遍地编写相同的样板代码,而是将它们定义为方面,瞧,spring 发挥了它的魔力,或者您。希望这会有所帮助!
【解决方案3】:

面向方面的编程是明智的新事物,它不是面向对象编程的替代品。事实上,AOP 是组织程序结构的另一种方式。

为了更清楚,我将使用一些图表:

  1. 什么是方面?

    |---------------------|------------------|------------------|
    |      Aspect         =     Point cut    +  Advice          |
    |---------------------|------------------|------------------|
    |                     | Where the aspect | What code is     |
    |                     |  is applied      |  executed.       |
    |---------------------|------------------|------------------|
    

    方面=切入点+建议

  2. 建议方法的类型

  3. 方面示例

    @Around( "execution(* *(..))" )
    public Object trace(ProceedingJoinPointproceedingJP)throwsThrowable{
        String methodInformation= proceedingJP.getStaticPart().getSignature().toString();
        logger.trace("Entering "+methodInformation);
        try{
            returnproceedingJP.proceed();
        } catch(Throwable ex) {
            logger.error("Exception in "+methodInformation, ex);
            throw ex;
        } finally {
             logger.trace("Exiting "+methodInformation);
        }
    }
    

【讨论】:

    【解决方案4】:

    AOP 通过将横切关注点分离(模块)成方面来实现内聚开发。 简单来说它只是一个拦截器,用来拦截一些进程,比如当一个方法被执行时,Spring AOP可以劫持正在执行的方法,并在方法执行之前或之后添加额外的功能。

    例如:日志、事务和安全是一些方面。在 Logging 中,我们可能有不同的方面,即时间计算日志,简单的进出消息日志等等..

    • Advise 定义了需要应用的内容。
    • Joinpoint 是应用建议 的地方。
    • 切入点是不同关节点的组合。
    • AspectPointcuts 应用Advice

    注意:Spring 不支持标记为 final 的方法的 AOP。

    Source


    AOP 的工作方式类似于面向对象的编程。在面向对象编程中,模块化单位是对象,但在面向方面编程中,模块化单位是AspectAspect 用作 AOP 中称为横切关注点的关注点的模块化。 AOP 框架在 spring 中是可插拔的。 AOP 提供声明式企业服务并允许用户实现自定义方面。

    Source


    Spring 使用 AOP 提供声明式编程。这是实现横切关注点的更好方法,无需在所有核心业务类中使用管道代码。 AOP 使您能够考虑系统中的关注点或方面。典型的关注点是事务管理、日志记录等。AOP 使您能够捕获模块(例如拦截器)中的横切代码,这些模块可以声明式地应用到它们表达的关注点适用的任何地方。 Spring 包含一个基于代理的 AOP 框架。

    Source

    【讨论】:

      【解决方案5】:

      简而言之,AOP 是一种数学家的方式,用于解释您应该如何整齐地组织代码,以避免特定功能分散在大量模块或对象中。从本质上讲,AOP 是一件好事,不管它是否被称为 AOP。

      但是您面临一个特定的 AOP 实现,需要弄清楚如何使用它。我认为最好的方法是寻找人们发布食谱的博客以及他们如何在 Spring 中使用它的示例。这样你就可以绕过数学家,阅读更贴近现实的工程师的著作。

      有两种计算机科学家,一种是喜欢晦涩难懂的数学家,喜欢用折磨人的术语来解释简单的事情,另一种是会一​​步一步告诉你如何构建软件的工程师。在职程序员往往更倾向于工程师思维,因为抽象思维者发现很难处理获得经验的漫长过程。这就是为什么你会发现 AOP 很难理解。不是因为它难以理解,而是因为抽象的数学思想家对“简单的英语”不太熟悉。

      我想知道如果 AOP 大师与功能点分析大师坐下来会发生什么。

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 2011-03-19
        相关资源
        最近更新 更多