tho*_*mas 5 java aspectj spring-aop pointcut
我在玩 aop 和 aspectj 并发现了一个(对我来说)意外的行为。
在aspectj-docs 中,我发现了以下示例切入点:
execution(public void Middle.*())
Run Code Online (Sandbox Code Playgroud)
对于以下类定义(我稍微更改了原始示例):
class Super {
public void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
@Override
public void m() { ... }
}
Run Code Online (Sandbox Code Playgroud)
该示例的描述指出:
[切入点] 挑选出返回 void 并且没有在 Middle 中声明或继承的参数的公共方法的所有方法执行,即使这些方法在 Middle 的子类中被覆盖。
这个例子是工作为我好,但如果类Sub不重写m(),该方法通话从外到m上Sub-instance不拦截。这不违反文档吗?
我在继承类中的切入点还有另一个问题,这是由使用代理引起的。但是在这种情况下,代理的使用不会导致这种行为,因为代理应该为所有被代理的类提供方法。还是我错过了什么?
我的方面定义:
@Aspect
public class MyAspect {
@Before(value = "execution(* Middle.*(..))", argNames="joinPoint")
public void myAdvice(JoinPoint joinPoint) {
System.out.println("adviced: " + joinPoint.getSignature());
}
}
Run Code Online (Sandbox Code Playgroud)