2011-12-02 9 views
14

In guice, l'ambito @Singleton non fa riferimento al modello Singleton.Guice - Come condividere la stessa istanza Singleton attraverso più iniettori/moduli

Secondo il libro "Dependency Injection" di "Dhanji":

Molto semplicemente, il contesto di un Singleton è l'iniettore stesso. La durata di un singleton è legata alla vita dell'iniettore (come nella figura 5.8). Pertanto, viene creata solo un'istanza di un singleton per ciascun iniettore . È importante sottolineare questo ultimo punto, poiché è possibile che esista più iniettori nella stessa applicazione. Nello scenario , ciascun iniettore contiene un'altra istanza dell'oggetto con ambito Singleton.

Singleton scope

E 'possibile condividere la stessa istanza Singleton attraverso più moduli e molteplici iniettori?

risposta

21

È possibile utilizzare 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

non vedo il motivo per cui avete bisogno di questo, ma se si vuole veramente, è possibile:

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