Reputation: 15442
I have this guice code
public class MainModule extends AbstractModule {
@Override
protected void configure() {
bind(GlobalSettings.class).toProvider(GlobalSettingsProvider.class).in(Singleton.class);
}
and
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");
}
}
and
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);
}
}
and
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
}
why do I see globalSettings
in instance of A
and in instance of ResultsComparerRunner
are different?
I wanted it to be singelton
Upvotes: 1
Views: 589
Reputation: 11993
I was curious about the behavior of provider binding plus singleton, so I created a test-gist based on your code:
@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);
}
Result: green. Meaning that your module setup is working, your problem must lie somewhere else. How do you pass the injector to the ResultsComparerRunner? Is this really the injector containing the singleton definition?
Upvotes: 6
Reputation: 15442
My problem was that I called
injector = Guice.createInjector(new MainModule());
twice in two different places-
which created two singletons.
Upvotes: 2