在我的项目中,我有一个配置文件,列出了接口的具体实现。
如何配置我的Guice模块,以便每当注入接口时我都可以从Type中获取具体类的实例?
interface A{}
class AImpl implements A{ @Inject public A(.....)}
class B {
@Inject
public B(A a) {}
}
class MyModule extends AbstractModule {
...
@Provides
public A getA(@ConfiguredClass String classname) {
Class<A> aClass = (Class<A>) Class.forName(classname);
// ???
// this needs to be instantiated by Guice to fulfill AImpl's dependencies
return aClass.newInstance();
}
}
config:
class: my.package.AImpl
答案 0 :(得分:2)
您可以在启动期间读取配置文件,将其转换为Map<Class, Class>
并将映射提供给模块并配置所有绑定,如下所示:
public class MyModule extends AbstractMdoule{
//interface -> concrete
Map<Class, Class> implementsMap;
...
public void configure() {
for (Map.Entry<Class, Class> implEntry : implementsMap.entrySet()) {
bind(implEntry.getKey()).to(implEntry.getValue());
}
}
}