我有一个Guice,其构造函数接受一个注入的参数:
@Singleton
public class MyClass {
private MyConfiguration myConfiguration;
@Inject
public MyClass(MyConfiguration myConfiguration) {
this.myConfiguration = myConfiguration;
}
}
现在,我希望能够注入参数取决于我运行的环境。在Test中,我想在生产中注入一个MyConfiguration对象,我想要注入另一个对象。
我有两个MyConfiguration提供程序。 MyConfigurationProvider读取外部配置文件并从那里获取配置。 MyConfigurationTestProvider只是对所有设置进行硬编码。
我不知道如何配置它。我试图在Guice模块中进行绑定,如:
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);
}
}
但这给了我绑定多个提供商的错误。
我的问题是,如何为同一个对象使用不同的提供程序取决于环境?
非常感谢。
答案 0 :(得分:3)
是的,默认情况下,Guice模块不能包含多个具有相同键的绑定。但是,您可以在创建进样器时使用模块的覆盖功能。此功能专为此目的而设计。
从测试模块中删除install()
并为您的测试环境创建一个注入器,如下所示:
Injector injector = Guice.createInjector(Modules.override(new MyGuiceModule()).with(new MyGuiceTestModule()));
这样,来自测试模块的MyConfiguration
绑定将替换生产模块的绑定。