【问题标题】:Injector Hierarchy / Child Injector explanation?喷油器层次结构/子喷油器解释?
【发布时间】:2013-08-31 17:58:58
【问题描述】:

我一直在网上寻找有关注入器层次结构以及如何/何时使用 createChildInjector() 的解释,但我找不到清晰简洁的解释。

这是我的用例:

  • 我有一个基础应用程序模块,我用它来注入某些上下文项。这个模块应该包含在每个注入器实例中。
  • 我有一个搜索数据库的搜索模块
  • 我有一个搜索 ElasticSearch 的搜索模块。此类中的某些绑定应覆盖数据库搜索模块中提供的绑定。

例如,假设数据库搜索模块包含:

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);

而 ElasticSearch 模块包含:

bind(PersonSearch.class).to(PersonElasticSearch.class); 

有没有办法创建一个注入器,其中包括来自数据库搜索模块的 PlaceSearch 绑定和来自 ElasticSearch 模块的 PersonSearch 绑定,而无需创建一个单独的模块,其中包含

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(PersonElasticSearch.class);

?这是 Modules.override() 的情况吗? createChildInjector 的案例?提前谢谢!

【问题讨论】:

    标签: java guice


    【解决方案1】:

    Modules.override()Stage.PRODUCTION 中不起作用。您应该使用PrivateModule,其中绑定仅在私有模块内有效/可见,因此您可以将不同的实现类绑定到同一个接口。然后您可以将 Private 模块安装到父模块,但您必须显式地 expose() 所有要使其对其他模块可见的绑定。

    Guice - Private Modules

    让我们说:

    DatabaseSearchModule.java(扩展 PrivateModule)

    bind(PlaceSearch.class).annotatedWith(Names.named("dbSearch")).to(HibernatePlaceSearch.class);
    bind(PersonSearch.class).to(HibernatePersonSearch.class);
    expose(PlaceSearch.class).annotatedWith(Names.named("dbSearch"));
    

    EleasticSearchModule.java(扩展 PrivateModule)

    bind(PersonSearch.class).annotatedWith(Names.named("elastic")).to(PersonElasticSearch.class);
    expose(PersonSearch.class).annotatedWith(Names.named("elastic"));
    

    那么你可以将它安装在一些 Parent abstract 或 servlet 模块中

    MainModule.java

    install(new DatabaseSearchModule());
    install(new EleasticSearchModule());
    
    bind(OtherClass.class);
    

    OtherClass.java

    @Inject @Named("elastic")
    private PlaceSearch elasticSearch;
    @Inject @Named("dbSearch")
    private PlaceSearch dbSearch;
    

    你可以使用Named注解或者你可以创建非常优雅的自己的绑定Annotation

    【讨论】:

      【解决方案2】:

      这是Modules.override() 的完美案例。

      大多数应用程序不应使用子注入器。它们增加了很多配置复杂性,并且在极端情况下有一些令人惊讶的行为。

      【讨论】:

      • 感谢您的回答。你能给我解释一下儿童注射器到底是什么吗?或者给我一个好的参考?我不确定我是否完全理解儿童注射器的概念。
      • 这个答案很好地解释了儿童注射器的概念:stackoverflow.com/a/12774246/205866
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多