Java 当拦截器没有默认构造函数时,如何在GoogleGuice中绑定拦截器?
我有以下Guice模块:Java 当拦截器没有默认构造函数时,如何在GoogleGuice中绑定拦截器?,java,java-8,guice,Java,Java 8,Guice,我有以下Guice模块: 公共类GuiceModule{ @凌驾 受保护的void configure(){} @提供 ClassA ClassA(){ 返回新的ClassA(); } @提供 ClassB ClassB(ClassA ClassA){ ClassB ClassB=新的ClassB(classA); classB.configure(123) b类修改(456); } @提供 ClassC ClassC(ClassB ClassB){ 返回新的ClassC(classB); }
公共类GuiceModule{
@凌驾
受保护的void configure(){}
@提供
ClassA ClassA(){
返回新的ClassA();
}
@提供
ClassB ClassB(ClassA ClassA){
ClassB ClassB=新的ClassB(classA);
classB.configure(123)
b类修改(456);
}
@提供
ClassC ClassC(ClassB ClassB){
返回新的ClassC(classB);
}
}
我需要添加以下bindInterceptor
bindInterceptor(
inSubpackage(“my.sub.package”),
annotatedWith(MyAnnotation.class),
c类);
根据的第140行,我只能从configure()
方法调用bindInterceptor
除了不使用@提供的
方法,而是在配置
方法中执行所有操作之外,我还有什么其他选项
注意:我没有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
}
然后在配置方法中:
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);
嗨,这看起来是个很好的答案。不幸的是,我忘了提到我没有任何类,所以我不能修改它们的构造函数。@David我更新了我的答案,记住了你的评论。