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

标签 java aop guice

我正在使用 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/

相关文章:

java - 在 Java 中添加其他数字时,如何检查数字是否高于 Integer.MAX_VALUE?

java - 主 Hibernate session 自动关闭

java - Spring Boot 服务静态资源

java - 我可以在运行时更改spring注入(inject)的实现类吗?

java - 我的 SpringAOP 演示代码中出现了 null 错误

dependency-injection - Actor 中的 WebSocket.acceptWithActor 和 @Inject() (Play 2.5)

java - 使用 Google Guice 使用字符串文字检索实例

scala - Guice Multibinder 不适用于 Play 框架

java - 使用 RSASSA-PKCS1-V1_5 使用私钥对有效负载进行数字签名

spring - Spring AOP 中抛出异常