0

我对编写一个匹配方法的所有执行的切入点感到困惑。我尝试了应该匹配类的所有方法执行的切入点Alpha

execution(* Alpha.*(..))

具有以下类层次结构

public class Alpha {
    public void alphaMethod() {...}
}
public class Beta extends Alpha {
    public void betaMethod() {
        alphaMethod();
    }
}

如果 Main-program 调用alphaMethod-instanceBeta我的建议会像预期的那样被调用,但是在我的建议内部调用的 Main-program 调用betaMethod不会alphaMethod被调用,我不明白为什么。

方面定义

@Aspect
public class MyAspect {
    @Before(value = "execution(* Alpha.*(..))", argNames="joinPoint")
    public void myAdvice(JoinPoint joinPoint) {
        System.out.println("BEFORE: " + joinPoint.getSignature());
    }
}

主要方法

Beta beta = ...;
beta.alphaMethod(); //advice is called
beta.betaMethod(); //advice is NOT called.
4

2 回答 2

1

这是意料之中的。

Spring AOP 使用代理类来包装建议的 bean。当您alphaMethod()Beta方法中调用时,代理甚至不知道它。

有关更多信息,请参阅答案。

于 2012-05-27T15:50:04.383 回答
1

正如已经回答的那样,原因很清楚。您可以通过使用加载时编织而不是代理来解决此问题(我想它归结为某个地方的配置选项和对 AspectJ 的依赖,如果还没有依赖它的话)或将 bean 作为依赖注入自身然后实现

public void betaMethod() {
    selfBean.alphaMethod();
}

这将起作用,因为selfBean与 的引用不同this,前者是对代理的引用,后者是对原始代理对象的引用。

于 2012-05-27T17:08:41.500 回答