gpt4 book ai didi

java - 忽略来自 bindInterceptor 中一个类的调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:40 25 4
gpt4 key购买 nike

我正在使用 Guice 为一个类中的所有方法创建一个拦截器,除了那些用我创建的特定类注释的方法:

这是抽象模块:

public class MyModule extends AbstractModule {

@Override
protected void configure() {

bindInterceptor(
Matchers.subclassesOf(MyFacade.class),
Matchers.not(Matchers.annotatedWith(DAO.class)),
new MyInterceptor());
}

}

现在,是否可以让我的 MethodInterceptor 忽略 MyFacade 中的所有方法,当它们被同一类中的另一个方法调用时(MyFacade)?

例如:

public class MyFacade{

@DAO
public void doSomething(){
...
}

public void a(){
...
b();
}

public void b(){
...
}

}

我不希望拦截器拦截从方法 a() 到方法 b() 的调用。

谢谢!

最佳答案

要让被拦截者知道哪个类正在调用它,没有简单的方法。此外,在大多数情况下,您会希望调用 b() 来运行拦截的方法——例如确保正确打开和关闭数据库事务。如果您需要确保拦截只发生在外部调用上,您就必须要聪明一点。

选项 1:重写拦截器以保持状态

考虑重写您的 MethodInterceptor 以让守卫检查它是否处于被拦截方法的中间。记住,bindInterceptor accepts instances ,所以如果涉及到它,您可以将调用堆栈状态保留在那里。这是不寻常的——拦截器通常被认为是无状态的——所以要很好地记录下来。

/**
* Prevents internal interceptor calls from within intercepted methods.
* Not thread safe.
*/
public abstract class GuardedInteceptor implements MethodInterceptor {
private boolean executionInProgress = false;

/** No-op if in the middle of an intercepted method. */
public Object invoke(MethodInvocation invocation) throws Throwable {
if (executionInProgress) {
return invocation.proceed();
}
executionInProgress = true;
Object returnValue = null;
try {
runBefore();
returnValue = invocation.proceed();
runAfter();
} finally {
executionInProgress = false;
}
return returnValue;
}

protected abstract void runBefore();
protected abstract void runAfter();
}

方案二:重写拦截类委托(delegate)给私有(private)方法

在你的情况下,我会将 b() 委托(delegate)给私有(private)方法 bInternal() 并从内部调用它而不是 b()我的门面。 Guice AOP 无法拦截私有(private)方法,因此您无需担心注释或配置任何其他内容。这也允许各个系统选择是调用可能被覆盖或拦截的公共(public)方法,还是调用有效最终的、可预测的私有(private)方法。 AOP拦截是通过继承实现的,所以标准规则是关于designing and documenting for inheritance在这里申请。

关于java - 忽略来自 bindInterceptor 中一个类的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362277/

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