Guice:是否可以根据类路径中存在的实例注入实例?

时间:2015-10-27 13:42:40

标签: java dependency-injection classpath guice

我有一个Guice 3.0模块和一些接口,其实现可能会有所不同。我想要的是通过在我的类路径上搜索它来实例化并注入一些依赖。

@Inject 
private MyInterface instance;

ConcreteImplementationA implements MyInterface {...}

ConcreteImplementationB implements MyInterface {...}

因此,如果在应用程序的类路径上找到ConcreteImplementationA.class,则应该注入,如果是ConcreteImplementationB,则注入B。

如果我必须为我的界面配置所有可能的绑定,这不是问题。

是否可以使用Guice实现它?

1 个答案:

答案 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();
    }
}