为什么Guice为我的单身人士创建一个新实例?

时间:2015-10-18 08:52:47

标签: java singleton guice

我有这个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

2 个答案:

答案 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());

在两个不同的地方两次 -

创造了两个单身人士。