gpt4 book ai didi

java - 仅当从某个类调用该方法时才拦截该方法?

转载 作者:行者123 更新时间:2023-12-01 23:29:27 25 4
gpt4 key购买 nike

使用 AspectJ 或 Spring Aop(无关紧要)是否可以仅在从某个类中调用该方法时才拦截该方法?

例子:

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”吗?谢谢

最佳答案

using AspectJ or Spring Aop (doesn't matter), is it possible to intercept a method only if that method is called from within a certain class?

AspectJ 可以(是否在 Spring 中使用,这无关紧要),但 Spring AOP 不行,因为你需要

  • 使用 call() 切入点和 JoinPoint.EnclosingStaticPart(注释样式)或 thisEnclosingJoinPointStaticPart(原生语法)的组合,如果和仅当您想检查直接调用者时,
  • 或者使用 call() 切入点和 this() 的组合,再次当且仅当您想要检查直接调用者时,
  • 或结合使用call()execution()cflow()cflowbelow() 切入点,如果你想检查一个可能的间接调用者(例如 GoodHouseFooHouse)。

上述所有方法仅在 AspectJ 中有效的原因是 Spring AOP 既不支持 call() 也不支持 cflow(),如记录 here .

Can "within" be used in this circumstance?

不,within() 在这种情况下没有帮助您。


更新: 此处引用了我的其他答案:


更新 2: 一个更不为人知的角落或 Spring AOP 是 ControlFlowPointcut类(class)。 Spring手册mentions it briefly without example , 但有一个 test in the Spring source code我找到了一个example on a 3rd-party website .它不能帮助您直接解决问题,但我可以想到一种解决方案,您可以在其中为每个允许的源类创建一个这样的切入点,并将每个切入点链接到实现您想要的方面行为的同一个顾问。这会很慢,因为 Spring 使用反射和调用堆栈,需要一些样板代码来手动连接所有内容,但它会起作用。

关于java - 仅当从某个类调用该方法时才拦截该方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66573140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com