我有一个Guice 3.0模块和一些接口,其实现可能会有所不同。我想要的是通过在我的类路径上搜索它来实例化并注入一些依赖。
即
@Inject
private MyInterface instance;
ConcreteImplementationA implements MyInterface {...}
ConcreteImplementationB implements MyInterface {...}
因此,如果在应用程序的类路径上找到ConcreteImplementationA.class,则应该注入,如果是ConcreteImplementationB,则注入B。
如果我必须为我的界面配置所有可能的绑定,这不是问题。
是否可以使用Guice实现它?
答案 0 :(得分:3)
您可以像这样注册custom provider:
public class MyModule extends AbstractModule {
private static final Class<MyInterface> myInterfaceClass = getMyInterfaceClass();
@SuppressWarnings("unchecked")
private static Class<MyInterface> getMyInterfaceClass() {
try {
return (Class<MyInterface>) Class.forName("ConcreteImplementationA");
} catch (ClassNotFoundException e) {
try {
return (Class<MyInterface>) Class.forName("ConcreteImplementationB");
} catch (ClassNotFoundException e1) {
// Handle no implementation found
}
}
}
@Provides
MyInterface provideMyInterface() {
return myInterfaceClass.newInstance();
}
}