2015-10-18 64 views
1

我有这样的吉斯代码为什么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 
    } 

为什么我在instanc看到globalSettingsAResultsComparerRunner的实例是不同的?

我想这是singelton

回答

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?这真的是包含singleton定义的注入器吗?

2

我的问题是,我在两个不同的地方 -

它创造了两个单身人士称为

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

两次。