2011-12-02 13 views
14

@ Guilleton kapsamı, Singleton modeline ait değildir. "Dhanji" nin "Bağımlılık Enjeksiyon" kitabına göre Guice - Birden çok enjektör/modül aracılığıyla aynı Singleton örneğinin nasıl paylaşılacağı

:

Basitçe, a tek bağlam enjektör kendisidir. 'un tekli bir ömrü, enjektörün ömrüne bağlıdır (Şekil 5.8'de olduğu gibi). Bu nedenle, enjektörüne her bir tek bir tek örnek oluşturulur. Bu son noktayı vurgulamak önemlidir, çünkü aynı uygulamada birden fazla enjektörün bulunması mümkündür. 'da böyle bir senaryoda, her bir enjektör tekil kapsamlı nesnenin farklı bir örneğini tutacaktır.

Singleton scope

çoklu modülleri ve çoklu enjektör aracılığıyla aynı Singleton örneği paylaşmak mümkün mü?

cevap

21

kullanabilirsiniz 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

Bunu neden ihtiyaç görmüyorum, ama sen gerçekten isterseniz, bu mümkün:

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); 
    } 
}