Elad Benda2
Elad Benda2

Reputation: 15442

why does Guice create a new instance for my singleton?

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

Answers (2)

Jan Galinski
Jan Galinski

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

Elad Benda2
Elad Benda2

Reputation: 15442

My problem was that I called

injector = Guice.createInjector(new MainModule());

twice in two different places-

which created two singletons.

Upvotes: 2

Related Questions