0

我有一个在我的 Web 应用程序中使用 Spring AOP 框架的类,就像下面显示的代码一样。我想知道如果我实现以下代码,为什么 Spring AOP 能够跟踪 add() 但不能跟踪 multiple()。

public interface calculator {
   public void add();
   public void multiple();
}

public class calculatorImpl implements calculator {

   public void add() {

      multiple();
   }

   public void multiple() {}
}

我做了一个实验,发现下面的代码工作正常。这意味着 Spring AOP 能够同时跟踪 add 和 multiple 函数。

ICalculator calcProxy = (ICalculator) context.getBean("calculatorProxy");
calcProxy.add();
calcProxy.multiple();

我认为这一定是multiple()代理 bean 注入的原因,而multiple()incalculatorImpl类不是,因此 Spring AOP 无法跟踪它。如果我错了,请纠正我。

我的下一个问题。是否有解决这个问题的方法,add()真正需要multiple()通过 Spring AOP 执行和获取跟踪?

4

1 回答 1

2

Spring AOP 并没有改变实际的方法,而是在 Object 周围添加了一个代理。一旦你进入内部对象(在add()方法内部),就没有代理了,你就在它下面。

我在过去的答案中更详细地解释了这种机制:

https://stackoverflow.com/a/4171649/342852

有三种方法可以处理这种情况:

  1. 使用AspectJ,而不是 Spring AOP。AspectJ 将行为编译到您的代码中,而 Spring AOP 使用围绕您的代码的代理。
  2. 从 Bean 内部访问代理。这真的很难看,但可以做到。
    示例代码(在这里你让类意识到它正在被代理,这与 AOP 所代表的一切相反):

    public void add() {
       ((Calculator)AopContext.currentProxy()).multiple();
    }
    

    稍微不那么可怕(在这里你让班级意识到它是由 Spring 管理的):

    @Autowired
    private ApplicationContext context;
    public void add() {
       context.getBean(Calculator.class).multiple();
    }
    
  3. 改变你的设计。示例:移动这两种方法以分离 bean 并将每个方法注入另一个 bean。
于 2012-07-05T14:56:04.077 回答