如何在 java play 中使用 guice 创建和使用实例

How to create and use and instance using guice in java play

我正在尝试使用 guice,我想在 Java Play 2.6

中创建一个随机 Web 服务客户端的单例

现在我有我的 WS 客户端,它作为 java 播放模块加载。当我 运行 应用程序时,没问题,我的客户端能够使用注入的 java 播放配置 (com.typesafe.config.Config)。但是如果我尝试在其他任何地方使用我的客户端,我会收到一条错误消息 No implementation for com.typesafe.config.Config was bound .

这是我的(非常简单的)客户:

import play.Logger;
import com.typesafe.config.Config;

@Singleton
public class MyClient {
    final Config config;

    @Inject
    public MyClient(Config config) {
        this.config = config;
        Logger.warn("constructor called")
        Logger.warn("Some config param:"+config.getString("some_param"))
    }

    public void doSomething() {
        Logger.warn("doSomething() called")
    }

}

我实现 Guice 的 AbstractModule 的模块:

import com.google.inject.AbstractModule;

public class MyClientModule extends AbstractModule {
    @Override 
    protected void configure() {
        bind(MyClient.class).asEagerSingleton();
    }

}

当我告诉 Play 在 applicationf.conf 中将其用作模块时,它起作用了(我在控制台中收到 "Constructor called""Some config param" 警告日志):

play {
  modules {
    enabled += external.MyClientModule
  }
}

但是如果我尝试从我的 HomeController 调用它:

public class HomeController extends Controller {
    public Result index() {
        Injector myClientInjector = Guice.createInjector(new MyClientModule());
        MyClient myClient = myClientInjector.getInstance(MyClient.class);
        return ok(views.html.index.render());
    }
}

然后我得到以下错误:

[CreationException: Unable to create injector, see the following errors:

1) No implementation for com.typesafe.config.Config was bound.
  while locating com.typesafe.config.Config
    for the 1st parameter of external.MyClient.<init>(MyClient.java:121)
  at external.MyClientModule.configure(MyClientModule.java:8)

1 error]

我很确定这里有一些问题,那么绑定和使用它的正确方法是什么?

asEagerSingleton() 绑定意味着它尽可能快地绑定。在这种情况下,Config 还没有绑定,所以它失败了。

使用

bind(MyClient.class).in(Singleton.class)

在需要时将其绑定为单例。

在 HomeController 中,使用构造函数注入:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

您可以像这样注释 1 个构造函数,因此它需要包含您要注入的所有 类。您可以结合构造函数和字段注入,但不推荐这样做。

在 HomeController 中,使用构造函数注入:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

您可以像这样注释 1 个构造函数,因此它需要包含您要注入的所有 类。您可以结合构造函数和字段注入,但不推荐这样做。