在java main中注入提供程序

在java main中注入提供程序,java,guice,Java,Guice,我有一个自定义提供程序,使用Guice和以下一些伪代码: public class MyProvider implements Provider<String> { public String get() { System.out.println("Called MyProvider.get()"); return "abcd"; } } public class MyModule extends AbstractModule {

我有一个自定义提供程序,使用Guice和以下一些伪代码:

public class MyProvider implements Provider<String> {
    public String get() {
        System.out.println("Called MyProvider.get()");
        return "abcd";
    }
}

public class MyModule extends AbstractModule {
    protected void configure() {
        bind(String.class).toProvider(MyProvider.class);
    }
}

public class MyManager {
    private MyProvider<String> myProvider;

    @Inject
    public MyManager(Provider<String> myProvider) { this.myProvider = myProvider; }
}
从JavaDoc获取:

返回用于获取给定类型实例的提供程序

听起来您需要传递返回的提供程序将提供的对象的类。由于您需要返回字符串的提供程序,因此我认为您需要传递
String.class

试试这个:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new MyModule());
    MyManager mgr = new MyManager(injector.getProvider(String.class));
}

我不确定这是否是“首选方式”,但这似乎有效:

Injector injector = Guice.createInjector(new MyModule());
MyManager mgr = injector.getInstance(MyManager.class);

我不喜欢这个解决方案,因为现在您正在使用“new”创建MyManager的实例,尽管它被配置为使用依赖项注入。混合使用“新”和注入是许多难以调试错误的根源。当涉及到guice时:当您使用“new”时,您将无法再受益于任何aop特性(注入器等)。
Injector injector = Guice.createInjector(new MyModule());
MyManager mgr = injector.getInstance(MyManager.class);