代码之家  ›  专栏  ›  技术社区  ›  mP.

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

  •  9
  • mP.  · 技术社区  · 15 年前

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

    我想添加/更改/删除绑定,同时保持单例已经存在于注入器中。更改是一个简单的例子,因为可以通过使用提供者来实现这种效果。但是,动态地添加或删除键(绑定定义)要复杂一些。

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

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

    1 回复  |  直到 15 年前
        1
  •  8
  •   Jesse Wilson    15 年前

    可以使用儿童注射器来完成此操作,但需要进行一些设置。子注入器将防止长期绑定依赖于短期绑定。下面是一个例子:

    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.
             */
        }
    }
    

    永久模块中的单例绑定将持续到该模块存在时为止。只要使用相应的注入器,临时模块中的单例绑定就可以持续。

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

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