我有以下情况:
public class InjectionTest {
private static class Sub {
@Inject private final String value = null;
}
private static class General {
@Inject private final Sub sub = null;
}
private static class MainOne {
@Inject private final General general = null;
}
private static class MainTwo {
@Inject private final General general = null;
}
public static void main(String... arguments) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override protected void configure() {
/* DO MAGIC */
}
});
MainOne mainOne = injector.getInstance(MainOne.class);
MainTwo mainTwo = injector.getInstance(MainTwo.class);
assertThat(mainOne.general.sub.value, is("one"));
assertThat(mainTwo.general.sub.value, is("two"));
}
}
我希望value
的实例可以MainOne
访问"one"
,value
实例访问MainTwo
"two"
Named
}。我尝试过以下方法:
General
注释;遗憾的是,这需要我自己创建Sub
实例或使用子注入器来创建Scope
个实例。GuiceServletContextListener
机制。我无法真正按照我想要的方式工作,并且感觉它从来没有打算这样做,事实上甚至根本不能这样做。(当然真实场景更复杂,一如既往:我有一个ServletModule
和一个Servlet
,我试图在所有创建的{{1}中重用几个类/服务实例,但也需要从servlet请求的几个专用模块。)
我错过了什么吗?是否有(相对)简单的方法来实现我想要的目标?
答案 0 :(得分:2)
首先,您不应该注入最终字段(请参阅注释)。我建议您删除final
修饰符,或使用构造函数注入。
可以通过使用私有模块来解决您的示例。但我不认为这是一个“简单”的解决方案。
Injector injector = Guice.createInjector(new PrivateModule() {
@Override
protected void configure() {
bind(String.class).toInstance("one");
bind(MainOne.class);
expose(MainOne.class);
}
}, new PrivateModule() {
@Override
protected void configure() {
bind(String.class).toInstance("two");
bind(MainTwo.class);
expose(MainTwo.class);
}
});
我认为您最好使用@Named
或创建自己的绑定注释。
另请阅读“机器人腿”问题的维基页面: https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of-objects