问题描述
我有以下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。它们全部来自第三方软件包。
解决方法
您必须以稍微不同的方式编写注入器,而不能使用构造函数注入。
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);