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

Ela*_*da2 1 java singleton guice

我有这个guice代码

public class MainModule extends AbstractModule {

    @Override
    protected void configure() {
  bind(GlobalSettings.class).toProvider(GlobalSettingsProvider.class).in(Singleton.class);
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)

为什么我看到globalSettings的实例A和实例 ResultsComparerRunner有所不同?

我希望它是singelton

Jan*_*ski 6

我很好奇提供商绑定加单的行为,所以我创建了一个测试- 依据根据您的代码:

 @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);
}
Run Code Online (Sandbox Code Playgroud)

结果:绿色.这意味着您的模块设置正常,您的问题必须在其他地方.如何将注入器传递给ResultsComparerRunner?这真的是包含单例定义的注入器吗?