【发布时间】:2019-11-13 11:48:27
【问题描述】:
我有以下课程
class A {
public void someone() {
helpMe();
}
private void helpMe() {
// do something here
}
}
class B extends A {
public void help() {
super.someone();
}
}
class C extends A {
public void me() {
super.someone();
}
}
所以我想在每次调用 helpMe 方法时做一些事情。 A.helpMe() 永远不会被显式调用。对A.helpMe() 的所有方法调用都是通过A.someone() 调用的,后者通过B.help() 或C.me() 进一步调用。
helpMe 包含所有其他类都需要的通用实现。
我尝试过的切入点
execution(* A.helpMe(..)) // does not work
execution(* A+.helpMe(..)) // does not work
execution(* *.helpMe(..)) // does not work
execution(* A.*(..)) // does not work
execution(* B.someone(..)) // does not work
execution(* A+.*(..)) // forms a point cut for B.help() and C.me() only
execution(* *.*(..)) // forms a point cut for B.help() and C.me() only
execution(* B.*(..)) // forms a point cut for B.help() only
我在某处读到pointcuts for super 是不允许的。如果是这样,有哪些有效的解决方法?
我尝试使用annotations 获取pointcut,但它也不起作用。
【问题讨论】:
-
Spring AOP 通过代理应用,内部方法调用不能被拦截。为此,您需要一个完整的 AOP 解决方案,例如 AspectJ,具有加载或编译时编织。
标签: java spring-boot aop aspectj pointcut