使用aspectj或SpringAOP(无所谓),只有在从某个类中调用某个方法时,才有可能截获该方法吗?
例子:
public class House() {
String address;
public House(String address) {
this.address = address;
}
public String getAddress() {
return this.address();
}
}
public class BadHouse() {
public void doNotIntercept() {
House h = new House("1234");
h.getAddress();
}
}
public class GoodHouse() {
public void intercept() {
House h = new House("4567");
h.getAddress();
}
}
public class houseInterceptor() {
@Before("execution(com.example.House.getAddress(..))")
// only intercept on GoodHouse.class???
public void beforeGetAddress();
}
在这种情况下可以使用“within”吗?谢谢您
1条答案
按热度按时间ibrsph3r1#
使用aspectj或SpringAOP(无所谓),只有在从某个类中调用某个方法时,才有可能截获该方法吗?
aspectj是可能的(无论是否从spring内部使用,这都无关紧要),但SpringAOP是不可能的,因为您需要这样做
或者结合使用
call()
切入点和JoinPoint.EnclosingStaticPart
(注解样式)或thisEnclosingJoinPointStaticPart
(本机语法),当且仅当要检查直接调用方时,或者结合使用
call()
切入点和this()
,当且仅当您要检查直接呼叫者时,或者结合使用
call()
或者execution()
以及cflow()
或者cflowbelow()
如果要检查可能的间接调用方(例如。GoodHouse
→Foo
→House
).上面所有这些只在aspectj中工作的原因是SpringAOP既不支持
call()
也不是cflow()
,如本文所述。在这种情况下可以使用“within”吗?
不,
within()
在这种情况下帮不了你。更新:以下是我的其他答案:
call()
+thisEnclosingJoinPointStaticPart
call()
+JoinPoint.EnclosingStaticPart
call()
+this()
call()
+cflow()
,可选择与this()
并展示如何使用thisEnclosingJoinPointStaticPart
为什么?thisEnclosingJoinPointStaticPart
直接打电话的人比Throwable.getStackTrace()
更新2:一个更未知的角落或Springaop是ControlFlowPointcut
班级。spring手册简单地提到了它,没有示例,但是spring源代码中有一个测试,我在第三方网站上找到了一个示例。它不能帮助您直接解决问题,但我可以想出一个解决方案,在该解决方案中,您可以为每个允许的源类创建一个这样的切入点,并将每个切入点链接到实现所需方面行为的同一个advisor。这将是缓慢的,因为spring使用反射和调用堆栈,需要一些样板代码来手动连接所有内容,但它可以工作。