我正在扩展Guice的AbstractModule
,并且在扩展类内部需要访问Guice的注射器。如果可以,如何实现?
我正在扩展Guice的AbstractModule
,并且在扩展类内部需要访问Guice的注射器。如果可以,如何实现?
Provider<X>
。Guice将注入X
或Provider<X>
到任何X
绑定、Provider<X>
绑定或@Provides X
绑定中,所以你几乎总是可以这样做。尽管如此,注入注入器将允许你通过反射获取实例,或者检查注入器的绑定(等等)。@Provides
方法中:模块可以包含使用@Provides
注释的小型提供程序。请记住,Injector
是可注入的:如果您需要在其中一个方法中使用Injector,则可以将其作为参数接受:
public class OneModule extends AbstractModule {
@Override public void configure() { /* ... */ }
@Provides YourDependency getYourDependency(Injector injector) {
return injector.getInstance(Class.forName(yourDependencyName));
}
@Provides Something getSomething(SomethingImpl something) {
return initialize(something); // preferred: only ask for what you need
}
@Provides SomethingElse getSomethingElse(Provider<Thing> thingProvider) {
return new SomethingElse(thingProvider); // asking for a provider works too
}
}
AbstractModules正是为了这个目的而公开了getProvider()
,但如果您在注入器准备好提供它之前(比如在配置时间)调用get()
,则会出现错误:
public class TwoModule extends AbstractModule {
@Override public void configure() {
bind(Thingy.class).toInstance(
new MyThingy(8675309, getProvider(Another.class)));
}
}
你可能可以调用getProvider(Injector.class)
,但我不知道这是否有效,也不知道你为什么想要这样做。
这是一个坏主意;直到所有的configure方法运行完毕,Guice才准备好提供实例。你能得到的最接近的是使用其他模块创建一个子注入器,并将其传递到此模块中,但即使如此,这也很少需要。
public class MainClass {
public static void main(String[] args) {
Injector firstStage =
Guice.createInjector(new OtherModule1(), new OtherModule2());
// An alternative design would @Inject-annotate fields in ThreeModule
// and get it from firstStage, but that's nonstandard and may be confusing.
Injector secondStage =
firstStage.createChildInjector(new ThreeModule(firstStage));
}
}
public class ThreeModule extends AbstractModule {
private final Injector otherInjector;
public ThreeModule(Injector otherInjector) {
this.otherInjector = otherInjector;
}
@Override public void configure() {
bindStuffBasedOn(otherInjector);
}
}
Injector
,但应该少量使用。public class MyClass
{
@Inject
public MyClass(Injector injector) { ... }
}
public class MyModule extends AbstractModule {
...
@Provides
public Something provideSomething(Injector injector) { ... }
}
@Provides
方法),因为直到运行configure
之后,Injector才会准备就绪。 - Jeff Bowman