Guice - 如何通过多个喷射器/模块共享同一个Singleton实例

时间:2011-12-02 12:57:04

标签: java dependency-injection singleton guice

在guice中,@ Singleton范围不是指Singleton模式。

根据"依赖注入" " Dhanji" :

  

很简单,单身人士的背景就是注射器本身。生命   单例与喷射器的寿命有关(如图5.8所示)。   因此,每个只创建一个单例实例   注射器。重要的是要强调最后一点,因为它是   多个喷射器可能存在于同一应用中。在   这样的场景,每个注入器都会持有不同的实例   单例范围的对象。

Singleton scope

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

2 个答案:

答案 0 :(得分:24)

您可以使用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

答案 1 :(得分: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);
    }
}