我有以下 Guice 模块:
class MyModule extends AbstractModule {
@Override
protected void configure() {
bindListener(Matchers.any(), new TypeListener() {...});
}
@Provides
SomeClass createSomeClass(final Parameter param) {
log(param.getValue()); <-- this gets logged
...
}
}
我发现奇怪的是我TypeListener
没有收到有关Parameter
类型的通知。即使提供者被调用并返回SomeClass
。我也很清楚地看到日志语句Parameter
是由 Guice 注入的。
@Override
protected void configure() {
bind(Parameter.class);
bindListener(Matchers.any(), new TypeListener() {...});
}
我知道Untargetted 绑定和声明:
非目标绑定会通知注入器类型,因此它可能会急切地准备依赖项。
我仍然希望 GuiceTypeListener
为任何第一次显式绑定或注入的类型调用。
那么我是否需要根据经验为此类类进行非目标绑定?
注意:Parameter
将构造函数标记为@Inject
并不能解决问题。
编辑:
完整的例子(希望我不要留下太多垃圾)如下:
public class TestGuice {
public static void main(String[] args) {
Injector parentInjector = Guice.createInjector(new ParentModule());
Injector childInjector = parentInjector.createChildInjector(new SubModule());
childInjector.getInstance(Runnable.class).run();
}
static class ParentModule extends AbstractModule {
@Override
protected void configure() {
}
}
static class SubModule extends AbstractModule {
@Override
protected void configure() {
bind(SampleInjectedClass.class); // <-- Comment/uncomment here
final TypeListener typeListener = new TypeListener() {
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
System.out.println("Type: " + type.getRawType());
}
};
bindListener(Matchers.any(), typeListener);
}
@Provides
Runnable createRunnable(final SampleInjectedClass sampleClass) {
return new Runnable() {
@Override
public void run() {
sampleClass.test();
}
};
}
}
static class SampleInjectedClass {
public void test() {
System.out.println("Test");
}
}
}
如果该行存在,则输出为:
类型:com.barcap.test.TestGuice$SampleInjectedClass 类
类型:类 com.google.inject.internal.ProviderMethod
测试
如果我删除我得到的行:
类型:类 com.google.inject.internal.ProviderMethod
测试
我注意到,如果注入器不是通过createChildInjector
代码创建的,bind(...)
则没有必要。