保持状态时改变(添加/删除绑定)Guice注入器的最佳方法

时间:2010-06-20 01:44:50

标签: guice mutable

我希望重新定义或更新模块中的某些绑定,而模块又由Injector使用。我意识到模块是不可变的,一旦绑定被吸入并注入其定义,就不能为所有实际目的而改变。

我想添加/更改/删除绑定,同时保持单身人士已经生活在注射器中。更改是一个简单的案例,因为可以通过使用提供程序来实现此效果。但是,动态添加或删除密钥(绑定定义)有点棘手。

任何想法,如果这应该或可以实际完成。

我认为最好的方法是每次添加/删除绑定时都会重新创建一个注入器,将定义从原始复制到新的,任何现有的单例都将由toInstance重新定义,而不是实现类型等。

1 个答案:

答案 0 :(得分:8)

儿童注射器可用于实现此目的,但需要一些设置。儿童注射器将防止长寿命绑定取决于短期绑定。这是一个例子:

class ForeverModule extends AbstractModule {
  ...
}

class TemporaryModule extends AbstractModule {
  ...
}

class Main {
    public static void main(String... args) {
        Injector foreverInjector = Guice.createInjector(new ForeverModule());

        Injector injector = foreverInjector.createChildInjector(
                new TemporaryModule());
        /*
         * Do stuff with the injector as you would normally. When you
         * get bored of that injector, create a replacement injector
         * as a child of the long-lived injector.
         */
    }
}

forever模块中的Singleton绑定将持续该模块存在的时间。只要您使用相应的进样器,临时模块中的单例绑定就会持续。

警告:默认情况下,将在顶级注入器中创建实时绑定。如果您需要一个短暂的绑定,您需要绑定子注入器模块中的接口和实现。看起来像这样:

    public void configure() {
        bind(Foo.class).to(RealFoo.class);
        bind(RealFoo.class);
    }