在建议之前和之后传递对象?

时间:2014-04-28 11:05:47

标签: java aop aspectj

是否可以在before建议中创建一个对象并将其传递给after建议?例如,如果我有方面:

public aspect LoggingAspect {

    pointcut allMethods() : execution(* com.foo.Bar.*(..));

    before() : allMethods() {
        SomeObject foo = makeSomeObject();
    }

    after() : allMethods() {
      // access foo?
    }
}

我无法直接引用foo,因为它不在范围内(触发编译器错误)。我可以将foo存储在哪个建议中可以使用某些上下文吗?

背景:我打算创建一个唯一的标识符来引用这个特定的方法调用,我需要在两个建议中访问它,因为我会将它包含在日志记录输出中。

在我建议的类中存储参数不是一个选项(因为我希望它不知道建议)。

2 个答案:

答案 0 :(得分:2)

您可以将其存储在成员变量中,但是您必须考虑线程安全性。相反,我强烈建议使用around建议。

Object around() : allMethods() {
    SomeObject foo = makeSomeObject();
    Object ret = proceed();
    foo.magic();
    return ret;
}

答案 1 :(得分:0)

在方面级别上将其定义为类成员:

public aspect LoggingAspect {
    SomeObject foo;
    before() : allMethods() {
        foo = makeSomeObject();
    }

    after() : allMethods() {
      foo.bar();
    }
}

根据documentation它应该有效。