gpt4 book ai didi

java - Guice:注入(inject)与布线

转载 作者:行者123 更新时间:2023-11-30 06:26:13 24 4
gpt4 key购买 nike

很多时候,类需要实例化(构造),然后“连接”(配置)才能使用。例如:

// Construction.
EventBus bus = new EventBus();
FizzEventHandler fizzHandler = new FizzHandler();
BuzzEventHandler buzzHandler = new BuzzHandler();

// Wiring.
bus.register(fizzHandler);
bus.register(buzzHandler);

在 Guice 中,我们使用 Binder 完成第一部分(构造;注入(inject)):

public class MyModule extends AbstractModule {
@Override
public void configure() {
bind(EventBus.class).to(SimpleEventBus.class);
bind(FizzEventHandler.class).to(DefaultFizzEventHandler.class);
bind(BuzzEventHandler.class).to(DefaultBuzzEventHandler.class);
}
}

但是接线发生在哪里?当我的基于 Guice 的应用程序启动时,我们会参与 DI“引导”过程:

public class MyApp {
private EventBus bus;
private FizzEventHandler fizzHandler;
// ...etc.

public static void main(String[] args) {
MyApp app = new MyApp();
app.run();
}

public MyApp() {
// Bootstrap DI.
MyModule myModule = new MyModule();
Injector injector = Guice.createInjector(myModule);

bus = injector.inject(EventBus.class);
fizzHandler = injector.inject(FizzEventHandler.class);
// ...etc.

// Wire
bus.register(fizzHandler);
}
}

这对顶级(根)DI 类有效。但是当我们进一步“向下”依赖树,并进入应用程序使用的所有其他对象时,像这样将连接逻辑放在构造函数中是丑陋的,并且(我相信)是一种不鼓励的做法.

所以我问:厌倦了战斗的 Guice 老兵将他们的布线/配置代码放在哪里?

最佳答案

我在一个使用 Guice 的相当大的系统(约 3000 个类)上工作。我会说我们的方法是用构造函数做所有事情。正如您所描述的,没有明显的“构建”和“布线” Activity ,只有构建。

在您的示例中,事件处理程序将是总线的构造函数参数,总线会将它们注册到其构造函数中。

如果你想相当灵活地注入(inject)给定类型的所有组件(在这里,你想将所有事件监听器注入(inject)总线),你可以使用 multibindings .但是,我认为我们实际上并没有在我们的代码库中使用它;我们只是写下需要注入(inject)的所有内容的手动列表,事实证明这在实践中并不那么费力。

关于java - Guice:注入(inject)与布线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662441/

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