这是奇怪的事情。假设你有一个这样的模块:
public class ParentModule extends AbstractModule {
@Override
public void configure() {
bindConstant().annotatedWith(Names.named("key")).to("key");
}
}
然后我们也有这样的事情:
public class DependentModule extends AbstractModule {
private final String key;
@Inject public DependentModule(@Named("key") String key) { this.key = key; }
@Override
public void configure() {
// Configure bindings that make use of key...
}
}
Injector parent = Guice.createInjector(new ParentModule());
Injector child = parent.createChildInjector(parent.getInstance(DependentModule.class));
// Now just ignore parent and work with child exclusively
这看起来非常麻烦,但在某些情况下可能是必要且有用的(例如,如果密钥是更复杂的数据类型)。无论如何,有没有办法重构此代码,以便ParentModule
绑定密钥,使用密钥创建DependentModule
,并安装创建的DependentModule
?也就是说,消费者可以简单地使用单个注射器而不必进行这种双注射器技巧?
答案 0 :(得分:3)
无法注入某些东西然后安装它。注入仅在所有configure()
方法运行后发生,此时为时已晚。但你可以这样做:
public class MyModule extends AbstractModule {
@Override
public void configure() {
bindConstant().annotatedWith(Names.named("key")).to("key");
}
@Provides
Dependency provideDependency(@Named("key") String key) {
// Use key here
}
}