当Interceptor没有默认构造函数时,如何在Google Guice中绑定Interceptor?

问题描述

我有以下Guice模块:

public class GuiceModule {
    @Override
    protected void configure() {}

    @Provides
    ClassA classA() {
        return new ClassA();
    }

    @Provides
    ClassB classB(ClassA classA) {
        ClassB classB = new ClassB(classA);
        classB.configure(123)
        classB.modify(456);
    }

    @Provides
    ClassC classC(ClassB classB) {
        return new ClassC(classB);
    }
}

我需要添加以下bindInterceptor

bindInterceptor(
    inSubpackage("my.sub.package"),annotatedWith(MyAnnotation.class),classC);

基于this file的第140行,我只能通过bindInterceptor方法调用configure()

除了不使用@Provides方法,而是使用configure方法执行所有操作之外,我还有哪些其他选择?

注意:我没有ClassA,ClassB或ClassC。它们全部来自第三方软件包。

解决方法

您似乎想inject your interceptors

您必须以稍微不同的方式编写注入器,而不能使用构造函数注入。

class ClassC {
  @Inject
  ClassB classB;                                         // Write all dependencies like this.
  @Inject
  void setClassB(ClassB classB) { this.classB = classB } // Or like this

  ClassC() { } // Write any constructor that you can actually instanciate manually
}

然后使用您的configure方法:

ClassC classC = new ClassC();
requestInjection(classC);
bindInterceptor(inSubpackage("foo"),annotatedWith(Bar.class),classC);

由于您无权访问拦截器代码,因此请编写自己的代码来封装所需的代码:

class MyInterceptor implements MethodInterceptor {
  ClassC delegate;
  
  @Inject
  void inject(ClassB classB) { // If more dependencies are required,you can add them as parameter here,it'll just work. Don't add a setter per dependency.
    delegate = new ClassC(classB);
  }
  
  @Override
  public Object invoke(MethodInvocation invocation) throws Throwable {
    return delegate.invoke(invocation);
  }
}

现在在您的configure方法中使用MyInterceptor代替ClassC

MyInterceptor interceptor = new MyInterceptor();
requestInjection(interceptor);
bindInterceptor(inSubpackage("foo"),interceptor);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...