我有一个Guice 3.0模块和一些接口,这些实现可能会有所不同。我想要的是通过在我的类路径上搜索实例化并注入一些依赖。
即
@Inject
private MyInterface instance;
ConcreteImplementationA implements MyInterface {...}
ConcreteImplementationB implements MyInterface {...}
因此,如果在应用程序的类路径上找到ConcreteImplementationA.class,则应将其注入;如果ConcreteImplementationB,则应将其注入。
如果必须为接口配置所有可能的绑定,这不是问题。
可以用Guice实施它吗?
最佳答案
您可以像这样注册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();
}
}