1

我有一个第 3 方数据库客户端,我想让 Guice 创建和管理一个单例实例,然后需要注入。

我知道使用 Guice 我可以注入一个“对象”,在这种情况下,它是一个使用接口和实现的数据库客户端。但是是否有可能让 Guice 直接创建并提供单例数据库客户端,就像 spring 允许的那样?

4

1 回答 1

2

不太确定“直接创建”部分,但至少有两个选项可以创建单例:

1. 注释实现

interface DbClient {
}

@Singleton
class DbClientImpl implements DbClient {
}

class DbClientModule extends AbstractModule {
  @Override public void configure() {
    bind(DbClient.class).to(DbClientImpl.class);
  }
}

2. 绑定为单例

interface DbClient {
}

class DbClientImpl implements DbClient {
}

class DbClientModule extends AbstractModule {
  @Override public void configure() {
    bind(DbClient.class).to(DbClientImpl.class).in(Singleton.class);
  }
}

就个人而言,我更喜欢第二种选择,因为它允许将同一类用作单例或不使用取决于上下文。

编辑:由另一个库创建的对象!

没问题。这是你如何处理的:

class DbClientModule extends AbstractModule {
  @Override public void configure() {
    DbClient client = AnotherLibrary.createDbClient();
    bind(DbClient.class).toInstance(client);
  }
}

编辑 2:如果我要提供的对象无法立即使用怎么办?

也没有问题。这是一个可以做的事情:

public static void main(String[] args) {
  DbClient client = SomeWeirdPlace.getDbClient();
  Injector injector = Guice.createInject(new MyModule(client));
  injector.getInstance(ServerInterface.class).start();
}

class MyModule extends AbstractModule {
  MyModule(DbClient client) {
    this.client = client;
  }
  @Override public void configure() {
    bind(Client.class).toInstance(client);
  }
}
于 2013-10-31T19:58:43.070 回答