当前位置: 首页 > 知识库问答 >
问题:

如何创建2个注入了类依赖关系的不同实现的类实例(通过guice)?

弘涛
2023-03-14

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

实现如下所示:

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

}

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

共有1个答案

云星波
2023-03-14

像这样的?

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);
  }
 类似资料:
  • 基于文档(4.7.6 -了解特定的依赖关系),我们可以通过指定配置本身来了解特定的配置。在示例中,他们将配置< code>compile用作不推荐使用的配置。我试图重现相同的命令,将< code>build.gradle中的< code>compile配置替换为< code>implementation配置(正如我所得到的,我们不应该再使用< code>compile)。但是当我跑的时候: Gra

  • 我使用泛型使代码可重用,并利用依赖项注入。 我有两个接口:DataParserImplementation和ObjectImplementation。我有实现每个的类:SalesRepbyId实现DataParserImpl(它将数据解析为对象并将这些对象放入集合)。SalesRep实现Objectimpl(它是特定数据集的对象)。 我试图得到它,这样我就可以选择在我的SalesRepbyId类中

  • 我的应用程序使用Play-2.4。2/Scala-2.11。6提供了对DI的内置GUI支持 我所有的DAO都将实现绑定到下面的接口,这应该是Guice中最简单的方法 上述实现不需要添加任何模块来提供绑定。 现在由于某种原因,我不想使用@Inject注释将依赖项注入到Books类的构造函数中。所以我试着注射如下 但这给我带来了一个guice配置异常,它说: 现在需要做什么?在这种情况下,我的方法是对

  • 我尝试使用java Spring映射对象DTO到对象正常 我尝试调用接口映射器,因为服务,但我有NullPointerExctive,似乎接口没有注入服务,我使用自动配置,我退出了这个 服务 制图员 错误 我尝试调试,我看到iUserMapper是空的,我不知道如何调用,因为服务 谢谢!

  • 当已知 reflect.Type 时,可以动态地创建这个类型的实例,实例的类型为指针。例如 reflect.Type 的类型为 int 时,创建 int 的指针,即 ,代码如下: 代码输出如下: *int ptr 代码说明如下: 第 13 行,获取变量 a 的反射类型对象。 第 16 行,使用 reflect.New() 函数传入变量 a 的反射类型对象,创建这个类型的实例值,值以 reflect

  • 基于文档(4.7.6-获取对特定依赖关系的洞察),我们可以获取特定配置的洞察,并指定配置本身。在本例中,他们将用作配置,但不推荐使用该配置。我尝试重现相同的命令,在中,将配置替换为配置(据我所知,我们不应该再使用)。但当我跑的时候: 格雷德尔回来了: 我的文件如下: 如果我使用,这是否意味着我无法了解依赖关系,或者是否有其他方法可以获得依赖关系?