为什么我的容器不能正确存储面向方面编程?

0mkxixxg  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(353)

这可能是因为误解,但我有以下几节课:

@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() 正在调用,但未在框中输入。这是怎么回事?

7vhp5slm

7vhp5slm1#

默认情况下,aspectj方面是单例的。其他的示例化模型也可以使用,但是你的肯定是一个单例,由aspectj运行时自动创建。现在您自己的方面构造函数调用 new Example() 创建另一个示例。正如roddy已经正确地指出的,这就是为什么你不再处理单个示例,因此也不再处理单个示例 Box 成员。
如果您想访问aspectj管理的单例方面示例,应该使用 Aspects.aspectOf(MyAspect.class) ,另请参见aspectj手册。这是一个mcve-很抱歉,我忍不住重命名了一些字段和方法,至少让这段非常奇怪的代码更具可读性:

package de.scrum_master.app;

import java.util.Vector;

public class Box {
  private Vector box = new Vector();

  public void enter(String s) {
     box.add(s);
  }

  public void show() {
     System.out.println(box);
  }
}
package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import de.scrum_master.app.Box;

@Aspect
public class MyAspect {
  private Box box = new Box();

  public Box getBox() {
    return box;
  }

  @Around("execution(* doSomething())")
  public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println(joinPoint);
    this.box.enter("myAdvice");
    return joinPoint.proceed();
  }

  public Object doSomething() {
    System.out.println("Doing something");
    this.box.enter("doSomething");
    return null;
  }
}
package de.scrum_master.app;

import org.aspectj.lang.Aspects;

import de.scrum_master.aspect.MyAspect;

public class Application {
  public static void main(String[] args) {
    MyAspect myAspect = Aspects.aspectOf(MyAspect.class);
    myAspect.doSomething();
    myAspect.getBox().show();
  }
}

运行应用程序时,控制台日志将为:

execution(Object de.scrum_master.aspect.MyAspect.doSomething())
Doing something
[myAdvice, doSomething]

相关问题