java—当拦截器没有默认构造函数时,如何在GoogleGuice中绑定拦截器?

disho6za  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(350)

我有以下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);

我只能打电话 `bindInterceptor` 从 `configure()` 方法,基于此文件的第140行。
除了不用,我还有什么选择 `@Provides` 方法,而不是在 `configure` 方法?
注:我不拥有classa、classb或classc。它们都来自第三方软件包。
jaql4c8m

jaql4c8m1#

看起来你想注入你的拦截器。
你必须写你的注入器略有不同,而不是使用构造函数注入。

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);
  }
}

现在使用 MyInterceptor 而不是 ClassC 在配置方法中:

MyInterceptor interceptor = new MyInterceptor();
requestInjection(interceptor);
bindInterceptor(inSubpackage("foo"), annotatedWith(Bar.class), interceptor);

相关问题