建筑与建筑注入客户端

时间:2013-10-31 19:49:20

标签: java language-agnostic inversion-of-control guice

我有一个第三方数据库客户端,我希望Guice创建并管理单例实例,然后需要注入。

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

1 个答案:

答案 0 :(得分: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);
  }
}