【问题标题】:injecting provider in java main [duplicate]在java main中注入提供程序[重复]
【发布时间】:2015-06-01 17:22:13
【问题描述】:

我有一个使用 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; }
}

有一个 MyManager 对象表示在 Guice 连接后我们将在未来构建什么。现在为了真正开始这个,我有点迷茫......

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

    // not sure what to do here.  This doesn't work but I thought it'd be something like this
    MyManager mgr = new MyManager(injector.getProvider(MyProvider.class));
}

【问题讨论】:

    标签: java guice


    【解决方案1】:

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

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

    你认为这是不是这样?

    【讨论】:

      【解决方案2】:

      来自Injector 的 JavaDoc:

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

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

      试试这个:

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

      【讨论】:

      • 我不喜欢这个解决方案,因为现在您正在使用“new”来创建 MyManager 的实例,尽管它被配置为使用依赖注入。混合“新”和注入是许多难以调试的错误的根源。说到 guice:当您使用“新”时,您将无法再受益于任何 aop 功能(注入器,...)。
      猜你喜欢
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2021-11-17
      • 2021-11-07
      • 2014-11-07
      相关资源
      最近更新 更多