2012-05-27 63 views
0

通过编写匹配方法的所有执行的切入点,我感到困惑。我想,应该匹配Alpha类的所有方法,执行的切入点:与下面的类层次结构带继承的切入点混淆

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

execution(* Alpha.*(..)) 

如果主程序上Beta呼吁alphaMethod -instance我的建议是所谓的预期,但主程序调用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. 

回答

1

这是预期。

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

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

+0

我仍然不期待这种行为,但使用代理导致此问题。谢谢! – thomas

+0

@darrengorman有没有办法告诉Spring将继承的方法包含在内? –

1

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

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

这工作,因为selfBean不是同一基准this,前者是对代理的引用,后者原来,代理对象的引用。

+0

是的,使用“selfBean”引用会有所帮助,但这是一种我不感兴趣的解决方法。但我会仔细研究织造设置。谢谢! – thomas