这可能是因为误解,但我有以下几节课:
@Aspect
public class Example {
@Getter
private Box b1 = new Box();
@Around("execution(p2())")
public Object p1(ProceedingJoinPoint jp) {
this.b1.enter("from p1()");
System.out.println("from p1()");
return jp.proceed();
}
public Object p2() {
this.b1.enter("from p2()");
System.out.println("from p2()");
return null;
}
}
还有我的 Box
只是一个向量 Package 器
public class Box {
private Vector box = new Vector();
public void enter(String s) {
this.box.add(s);
}
public void show() {
System.out.println(this.box);
}
}
现在我试着执行
Example e1 = new Example()
e1.p2();
我在控制台上看到:
from p1()
from p2()
这个 @Aspect
部分是工作,但我的 Box
没有注册所有的条目!如果我尝试
e1.getB1().show();
我只看到 from p2()
在盒子里。很明显 p1()
正在调用,但未在框中输入。这是怎么回事?
1条答案
按热度按时间7vhp5slm1#
默认情况下,aspectj方面是单例的。其他的示例化模型也可以使用,但是你的肯定是一个单例,由aspectj运行时自动创建。现在您自己的方面构造函数调用
new Example()
创建另一个示例。正如roddy已经正确地指出的,这就是为什么你不再处理单个示例,因此也不再处理单个示例Box
成员。如果您想访问aspectj管理的单例方面示例,应该使用
Aspects.aspectOf(MyAspect.class)
,另请参见aspectj手册。这是一个mcve-很抱歉,我忍不住重命名了一些字段和方法,至少让这段非常奇怪的代码更具可读性:运行应用程序时,控制台日志将为: