In guice, the @Singleton scope does not refer to the Singleton pattern.
According to the "Dependency Injection" book of "Dhanji" :
Very simply, a singleton's context is the injector itself. The life of a singleton is tied to the life of the injector (as in figure 5.8). Therefore, only one instance of a singleton is ever created per injector. It is important to emphasize this last point, since it is possible for multiple injectors to exist in the same application. In such a scenario, each injector will hold a different instance of the singleton-scoped object.
Is it possible to share the same Singleton instance through multiple modules and multiple injectors ?
You can use 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
I don't see why you need that, but if you really want, it's possible:
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);
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.