我有一个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();
    }
}

10-08 15:15