【问题标题】:Guice: using Injector?Guice:使用注射器?
【发布时间】:2014-11-12 18:34:01
【问题描述】:

我有一个 Maven 模块,我在其中定义了一些在其他几个 Maven 模块之间共享的实用程序。 在这个模块中,我想创建一些单例:

package org.me.util;

public interface Baz {
    String myMethod(String s);
}

@Singleton
public class Foo implements Baz {
private Bar bar;

    @Inject
    Foo(Bar bar) {
        this.bar = bar;
    }

    @Override
    public String myMethod(String s) {
        return s;
    }

}

然后我将我的界面绑定到:

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Baz.class).to(Foo.class);
    }

}

假设我想从另一个 Maven 模块(例如,一个 Web 服务)中使用这个单例,我该如何实现呢? 我发现的唯一方法是在我的 util Maven 模块中创建一个类,例如:

package org.me.util;
public class Main {

    private static Injector injector = Guice.createInjector(new MyModule());;

    public static Injector getInjector() {
        return injector;
    }

或者,我可以在 Guice 教程中看到的静态 main 方法中创建注入器,并将实例保存在某处。

然后从我的网络服务中执行以下操作:

Baz baz = Main.getInjector().getInstance(Baz.class);    

但这似乎不太优雅,因为我必须传递我的注入器(在这种情况下,通过为其提供静态 getter)。

还有其他方法吗?谢谢。

【问题讨论】:

  • 理想情况下,您还可以注入其他模块中的任何内容。你能@Inject Baz baz 然后从注入器中获取任何需要Baz 的实例吗?
  • 我不确定我是否关注你。我正在使用 Guice 和 DI 迈出第一步。但是注入像@Inject Baz baz 这样的字段不是不好的做法吗?无论如何,我不明白我应该如何在不使用注入器的情况下获得我的单例实例。
  • 对 - 您也可以注入到其他类的构造函数中。我要说的是,如果可能的话,你应该在你需要的地方@Inject你的单身人士。 Guice 只有在创建对象时才能为您提供帮助。

标签: java dependency-injection guice


【解决方案1】:

传递Baz 对象的更优雅的方法是注入它。

例如,

 public class BusinessService {
     private final Baz baz;
     @Inject
     public BusinessService(Baz baz) { this.baz = baz; }
 }

如果您想在 WS 中使用 BusinessService。

 public class WebService {
     private final BusinessService businessService;
     @Inject
     public WebService(BusinessService businessService) { this.businessService = businessService; }
 }

通过这样做,所有依赖项都清楚地暴露在 API 签名中。


剩下的问题是您必须在应用程序的入口点创建 Injector。

在独立应用程序中,注入器通常在 main 方法中创建。

public static void main(String[] args) {
     Injector injector = Guice.createInjector(new UtilModule(), new BusinessModule());
     BusinessService businessService = injector.getInstance(BusinessService.class);
     ...

}

在 Web 应用程序中,注入器可能以不同的方式创建。这取决于框架。

小服务程序:

Dropwizard:

playframework

...

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多