我有这个guice代码
public class MainModule extends AbstractModule {
@Override
protected void configure() {
bind(GlobalSettings.class).toProvider(GlobalSettingsProvider.class).in(Singleton.class);
}
和
public class GlobalSettingsProvider implements Provider<GlobalSettings> {
@Override
public GlobalSettings get() {
GlobalSettings globalSettings = new GlobalSettings();
globalSettings.isDummyRun = Boolean.parseBoolean(System.getProperty("isDummyRun", "false"));
globalSettings.inputFlavor = System.getProperty("input_flavor", "none");
}
}
和
public class A(){
public A() {
this.injector = Guice.createInjector(new MainModule());
injector.getInstance(IHttpClientReRunWrapper.class);
globalSettings = injector.getInstance(GlobalSettings.class);
resultsComparerRunner1 = injector.getInstance(ResultsComparerRunner.class);
resultsComparerRunner2 = injector.getInstance(ResultsComparerRunner.class);
resultsComparerRunner3 = injector.getInstance(ResultsComparerRunner.class);
}
}
和
public class ResultsComparerRunner(){
public class ResultsComparerRunner(){
initStaticFromInjector();
}
private void initStaticFromInjector() {
routingResponseShortRepository = injector.getInstance(IRoutingResponseShortRepository.class);
globalSettings = injector.getInstance(GlobalSettings.class); //verify only one injector per run
}
为什么我在globalSettings
的实例中看到A
,而ResultsComparerRunner
的实例却不同?
我希望它是singelton
答案 0 :(得分:6)
我很好奇提供程序绑定加单例的行为,因此我根据您的代码创建了一个测试 - gist:
@Test
public void execute() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(GlobalSettings.class).toProvider(GlobalSettingsProvider.class).in(Singleton.class);
}
});
GlobalSettings g1 = injector.getInstance(GlobalSettings.class);
GlobalSettings g2 = injector.getInstance(GlobalSettings.class);
assertThat(g1).isSameAs(g2);
}
结果:绿色。这意味着您的模块设置正常,您的问题必须在其他地方。如何将注入器传递给ResultsComparerRunner?这真的是包含单例定义的注入器吗?
答案 1 :(得分:2)
我的问题是我打电话了
injector = Guice.createInjector(new MainModule());
在两个不同的地方两次 -
创造了两个单身人士。