gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:08:27 24 4
gpt4 key购买 nike

我希望重新定义或更新模块中的一些绑定(bind),这些绑定(bind)又被注入(inject)器使用。我意识到模块是不可变的,一旦绑定(bind)被吸收和注入(inject),它的定义就不能改变所有实际目的。

我想添加/更改/删除绑定(bind),同时保持单例已经存在于注入(inject)器中。更改是一个简单的案例,因为可以通过使用 Provider 来实现此效果。但是动态添加或删除 Key(绑定(bind)定义)有点棘手。

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

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

最佳答案

可以使用子注入(inject)器来完成此操作,但需要一些设置。子注入(inject)器将防止长期绑定(bind)依赖于短期绑定(bind)。这是一个例子:

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 模块中的单例绑定(bind)就会持续存在。只要您使用相应的注入(inject)器,临时模块中的单例绑定(bind)就会持续存在。

警告:默认情况下,将在顶级注入(inject)器中创建即时绑定(bind)。如果您需要短期绑定(bind),则需要在子注入(inject)器模块中绑定(bind)接口(interface)和实现。看起来像这样:
public void configure() {
bind(Foo.class).to(RealFoo.class);
bind(RealFoo.class);
}

关于guice - 在保持状态的同时改变(添加/删除绑定(bind))Guice 注入(inject)器的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com