是否可以在before建议中创建一个对象并将其传递给after建议?例如,如果我有方面:
public aspect LoggingAspect {
pointcut allMethods() : execution(* com.foo.Bar.*(..));
before() : allMethods() {
SomeObject foo = makeSomeObject();
}
after() : allMethods() {
// access foo?
}
}
我无法直接引用foo
,因为它不在范围内(触发编译器错误)。我可以将foo
存储在哪个建议中可以使用某些上下文吗?
背景:我打算创建一个唯一的标识符来引用这个特定的方法调用,我需要在两个建议中访问它,因为我会将它包含在日志记录输出中。
在我建议的类中存储参数不是一个选项(因为我希望它不知道建议)。
答案 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它应该有效。