gpt4 book ai didi

java - 注入(inject)器层次结构/子注入(inject)器解释?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:48 26 4
gpt4 key购买 nike

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

这是我的用例:

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

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

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

ElasticSearch 模块包含:

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

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

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

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

最佳答案

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

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"));

那么你可以将它安装在一些父抽象或 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 注释或者您可以创建非常优雅的自己的绑定(bind)Annotation .

关于java - 注入(inject)器层次结构/子注入(inject)器解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com