我希望重新定义或更新模块中的某些绑定,而模块又由Injector使用。我意识到模块是不可变的,一旦绑定被吸入并注入其定义,就不能为所有实际目的而改变。
我想添加/更改/删除绑定,同时保持单身人士已经生活在注射器中。更改是一个简单的案例,因为可以通过使用提供程序来实现此效果。但是,动态添加或删除密钥(绑定定义)有点棘手。
任何想法,如果这应该或可以实际完成。
我认为最好的方法是每次添加/删除绑定时都会重新创建一个注入器,将定义从原始复制到新的,任何现有的单例都将由toInstance重新定义,而不是实现类型等。
答案 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);
}