java - Guice:使用注入(inject)器?

标签 java dependency-injection guice

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

}

然后我将接口(interface)绑定(bind)为:

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

或者,我可以在静态主方法中创建注入(inject)器,如 Guice 教程中所示,并将实例保存在某处。

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

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

但这看起来不太优雅,因为我必须传递我的注入(inject)器(在本例中通过为其提供静态 getter)。

还有别的办法吗?谢谢。

最佳答案

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

例如,

 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 签名中清楚地公开。

<小时/>

剩下的问题是您必须在应用程序的入口点创建注入(inject)器。

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

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

}

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

Servlet:

Dropwizard :

playframework

...

关于java - Guice:使用注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26771480/

相关文章:

java.lang.NoSuchMethodError : org. Elasticsearch .common.settings.Settings.settingsBuilder()

java - 如何在没有公钥的情况下使用 Java 中的 BouncyCaSTLe 验证 PGP 签名的文本

symfony - 在 Symfony 2 Bundle 语义配置中允许键值对

android - Dagger 2 如何让 Android 上的测试更容易?

unit-testing - 我如何让 Guice 和 TestNg 一起玩,a-la-AtUnit 风格

java - Java 有类似 ELMAH 的东西吗?

c# - 如何在 ASP.NET Core 3.1 中获取服务实例

java - 在 Guice 中绑定(bind)二维数组

java - 加速多个数据库的大量插入

java - 值聚类