2011-12-02 96 views
14

在guice中,@Singleton作用域不引用Singleton模式。Guice - 如何通过多个注入器/模块共享同一个Singleton实例

据“Dhanji”的“依赖注入”的书:

很简单,一个单身的情况下为注射器本身。 单身的寿命与注射器的寿命有关(如图5.8所示)。 因此,每个 喷油器只能创建一个单例的实例。强调最后一点非常重要,因为在同一个应用程序中可能存在多个注入器的 。在 这种情况下,每个注入器将保存单个作用域对象的不同实例。

Singleton scope

是否有可能通过多个模块和多个注射器共享同一个Singleton实例?

回答

21

您可以使用Injector.createChildInjector

// bind shared singletons here 
Injector parent = Guice.createInjector(new MySharedSingletonsModule()); 
// create new injectors that share singletons 
Injector i1 = parent.createChildInjector(new MyModule1(), new MyModule2()); 
Injector i2 = parent.createChildInjector(new MyModule3(), new MyModule4()); 
// now injectors i1 and i2 share all the bindings of parent 
3

我不明白为什么你需要的,但如果你真的想要的,这是可能的:

package stackoverflow; 

import javax.inject.Inject; 
import javax.inject.Singleton; 

import junit.framework.Assert; 

import org.junit.Test; 

import com.google.inject.AbstractModule; 
import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.Module; 

public class InjectorSingletonTest { 

    static class ModuleOne extends AbstractModule { 
     @Override 
     protected void configure() { 
      bind(MySingleton.class); 
     } 
    } 

    static class ModuleTwo extends AbstractModule { 
     final MySingleton singleton; 

     @Inject 
     ModuleTwo(MySingleton singleton){ 
      this.singleton = singleton; 
     } 

     @Override 
     protected void configure() { 
      bind(MySingleton.class).toInstance(singleton); 
     } 
    } 

    @Singleton 
    static class MySingleton { } 

    @Test 
    public void test(){ 
     Injector injectorOne = Guice.createInjector(new ModuleOne()); 

     Module moduleTwo = injectorOne.getInstance(ModuleTwo.class); 
     Injector injectorTwo = Guice.createInjector(moduleTwo); 

     MySingleton singletonFromInjectorOne = 
       injectorOne.getInstance(MySingleton.class); 

     MySingleton singletonFromInjectorTwo = 
       injectorTwo.getInstance(MySingleton.class); 

     Assert.assertSame(singletonFromInjectorOne, singletonFromInjectorTwo); 
    } 
} 
相关问题