了解春季 AOP [已关闭]

2022-09-04 05:14:28

我正在使用Spring 3.0框架,仍然是一个新手。任何人都可以用外行的术语解释一下什么是AOP编程?(一个简短的例子肯定会有所帮助)

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


答案 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 创建时,还是在类加载时,就好像您最初以这种方式编写类一样。


答案 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. AOP在春季项目中最常见的用途是什么

推荐