我有以下情形:注入值將被注入
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"));
}
}
我想從MainOne
實例的value
訪問是"one"
和value
從MainTwo
實例訪問是"two"
。我曾嘗試以下:
- 使用Guice的
Named
註釋;不幸的是,這需要我自己創建General
實例或使用子注入器來創建Sub
實例。 - 使用Guice的
Scope
機制。我無法真正按照我想要的方式讓它工作,並感覺它從來沒有打算這樣做,事實上,即使也不能這樣做。
(當然實際情況比較複雜,一如既往:我有一個GuiceServletContextListener
和ServletModule
和我想要重用幾個類/所有創建Servlet
實例之間的服務,而且還需要一對夫婦專門從servlets中請求的模塊。)
我錯過了什麼嗎?有一種(相對)簡單的方法來實現我想要的嗎?
這就是所謂的「機器人腿」的問題。這是Guice的建議:https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of-objects – 2014-11-03 14:33:42