AspectJ:从一个匹配建议到另一个匹配建议的变量转移

时间:2017-01-11 09:24:39

标签: java aop aspectj

我有两个匹配相同切入点的建议。他们应该一个接一个地进行。例如:

pointcut som(TargetClass t, CallingClass c): target(t) && this(c) && call(public * TargetClass .*(..) );

before(TargetClass t, CallingClass c): som(t, c) 
{
    System.out.println("Entering: " + thisJoinPoint);
    String identifier = <...>; //Generating unique identifier for a method call
    getMonitor().addRecord(identifier, new Date()); //Sending new record to a custom monitor object
}

after(TargetClass t, CallingClass c): som(t, c) returning
{
    getMonitor().finishRecord(identifier, new Date());
}

这就是我一般看待逻辑的方式。问题是如何在“之后”建议中提供“之前”建议中创建的变量。我不太了解ApsectJ来解决这个问题。

1 个答案:

答案 0 :(得分:1)

这是Stefan回答的更正版本(抱歉,由于格式化代码,我无法将其发布为评论):

public aspect MyAspect {
    pointcut som(TargetClass t, CallingClass c) :
        target(t) && this(c) && call(public * TargetClass .*(..) );

    Object around(TargetClass t, CallingClass c) : som(t, c) {
        System.out.printf("%s%n  this   = %s%n  target = %s%n", thisJoinPoint, c, t);
        String identifier = UUID.randomUUID().toString();
        getMonitor().addRecord(identifier, new Date());
        Object result = proceed(t, c); 
        getMonitor().finishRecord(identifier, new Date());
        return result;
    }
}
  • around()建议需要与切入点匹配的返回类型,或者由于缺乏更好的知识,Object
  • proceed()的参数列表必须与建议的参数列表一致。
  • 除非返回类型为void,否则您需要返回proceed()的结果(已修改或未更改,或者甚至是相同类型的完全不同的对象替换原始对象)。如果您总是想要返回另一个对象并停止原始方法的完全执行,您甚至可以跳过proceed()
  • 如果您想在继续之后做其他事情,但在返回结果之前,您需要缓冲结果。