Guice:使用Injector?

时间:2014-11-06 04:00:33

标签: java dependency-injection guice

我有一个Maven模块,我在其中定义了一些与其他几个Maven模块共享的util。 在这个模块中,我想创建一些单例:

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);    

但这似乎并不优雅,因为我必须通过我的注射器(在这种情况下,通过提供静态吸气剂)。

还有其他方法吗?感谢。

1 个答案:

答案 0 :(得分: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应用程序中,可能以不同的方式创建注入器。这取决于框架。

的Servlet

Dropwizard

playframework

...