0

我有一个名为“消费者”的界面。

实现如下所示:

public class ConsumerImpl  implements Consumer {
  DBManager  m_dbm ;
  @Inject
  public ConsumerImpl  (DBManager dbm) {
    m_dbm = sdbm;       
  }

}

我需要有 2 个 consumerImpl 类的实例,但要注入不同的 DBManager 实现。如何通过 guice 进行配置?

4

1 回答 1

2

像这样的东西?

public class GuiceDependencyExample {

  static class DBManager {}
  static class DBManagerVendor1 extends DBManager {}
  static class DBManagerVendor2 extends DBManager {}
  static interface Consumer {
    DBManager getDbManager();
  }

  static @Retention(RetentionPolicy.RUNTIME) @BindingAnnotation @interface DBManager1 {}
  static @Retention(RetentionPolicy.RUNTIME) @BindingAnnotation @interface DBManager2 {}

  static class ConsumerImpl  implements Consumer {
    DBManager  m_dbm;
    @Inject
    public ConsumerImpl  (DBManager dbm) { m_dbm = dbm; }

    public DBManager getDbManager() { return m_dbm; }
  }

  static abstract class ConsumerModule extends PrivateModule {
    private final Class<? extends Annotation> annotation;

    ConsumerModule(Class<? extends Annotation> annotation) {
      this.annotation = annotation;
    }

    @Override 
    protected void configure() {
      bind(Consumer.class).annotatedWith(annotation).to(ConsumerImpl.class);
      expose(Consumer.class).annotatedWith(annotation);
      bindDbManager();
    }

    abstract void bindDbManager();
  }

  static class Client {
    @DBManager1
    @Inject
    Consumer consumer1;

    @DBManager2
    @Inject
    Consumer consumer2;
  }

  @Test
  public void test() {
    Injector i = Guice.createInjector(
        new ConsumerModule(DBManager1.class) {
          @Override void bindDbManager() {
            bind(DBManager.class).toInstance(new DBManagerVendor1());
          }
        },
        new ConsumerModule(DBManager2.class) {
          @Override void bindDbManager() {
            bind(DBManager.class).toInstance(new DBManagerVendor2());
          }
        });
    Client client = i.getInstance(Client.class);
    assertTrue(client.consumer1.getDbManager() instanceof DBManagerVendor1);
    assertTrue(client.consumer2.getDbManager() instanceof DBManagerVendor2);
  }
于 2013-09-09T20:41:21.940 回答