gpt4 book ai didi

java - Guice 中一个类的多个提供者

转载 作者:行者123 更新时间:2023-11-29 05:43:38 25 4
gpt4 key购买 nike

我有一个 Guice,其构造函数接受注入(inject)的参数:

@Singleton
public class MyClass {
private MyConfiguration myConfiguration;

@Inject
public MyClass(MyConfiguration myConfiguration) {
this.myConfiguration = myConfiguration;
}
}

现在,我希望能够注入(inject)参数取决于我运行它的环境。在测试中,我想注入(inject)一个 MyConfiguration 对象,而在生产中我想注入(inject)另一个对象。

我有两个 MyConfiguration 提供程序。 MyConfigurationProvider 读取外部配置文件并从那里获取配置。 MyConfigurationTestProvider 只是对所有设置进行硬编码。

虽然我不知道如何配置它。我尝试在 Guice 模块中进行绑定(bind),例如:

public class MyGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(MyConfiguration.class).toProvider(MyConfigurationProvider.class).in(Singleton.class);
}
}

并且在测试的Guice模块中,使用:

public class MyGuiceTestModule extends AbstractModule {
@Override
protected void configure() {
install(new MyGuiceModule());
bind(MyConfiguration.class).toProvider(MyConfigurationTestProvider.class).in(Singleton.class);
}
}

但这给了我绑定(bind)多个提供商的错误。

我的问题是如何根据环境对同一对象使用不同的提供程序?

非常感谢。

最佳答案

是的,默认情况下,Guice 模块不能包含具有相同键的多个绑定(bind)。但是,您可以在创建注入(inject)器时使用模块的覆盖功能。此功能正是为此目的而设计的。

从您的测试模块中删除 install() 东西并为您的测试环境创建一个注入(inject)器,如下所示:

Injector injector = Guice.createInjector(Modules.override(new MyGuiceModule()).with(new MyGuiceTestModule()));

有了这个,您对来自测试模块的 MyConfiguration 的绑定(bind)将替换来自生产模块的绑定(bind)。

关于java - Guice 中一个类的多个提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16606526/

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