切入点与继承混淆

时间:2012-05-27 15:05:45

标签: java aspectj spring-aop pointcut

我很困惑,编写一个匹配方法的所有执行的切入点。我尝试了切入点,它应该匹配类Alpha的所有方法执行:

execution(* Alpha.*(..))

使用以下class -hierachy

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

如果主程序在alphaMethod - 实例上调用Beta,我的建议会按预期调用,但主程序调用{​​{1}}也会在我的内部调用betaMethod建议没有被调用,我不明白为什么。

方面清晰度

alphaMethod

主-方法

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

2 个答案:

答案 0 :(得分:1)

这是预期的。

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

有关详细信息,请参阅this答案。

答案 1 :(得分:1)

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

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

这将有效,因为selfBeanthis的引用不同,前者是对代理的引用,后者是对原始代理对象的引用。