Java 喷油器层次结构/子喷油器说明?

Java 喷油器层次结构/子喷油器说明?,java,guice,Java,Guice,我一直在网上寻找有关injector继承权以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释 以下是我的用例: 我有一个基本的应用程序模块,用于注入特定的上下文项。该模块应包含在每个喷油器实例中 我有一个搜索模块,搜索数据库 我有一个搜索模块,搜索ElasticSearch。此类中的某些绑定应覆盖数据库搜索模块中提供的绑定 例如,假设数据库搜索模块包含: bind(PlaceSearch.class).to(HibernatePlaceSearch.

我一直在网上寻找有关injector继承权以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释

以下是我的用例:

  • 我有一个基本的应用程序模块,用于注入特定的上下文项。该模块应包含在每个喷油器实例中
  • 我有一个搜索模块,搜索数据库
  • 我有一个搜索模块,搜索ElasticSearch。此类中的某些绑定应覆盖数据库搜索模块中提供的绑定
例如,假设数据库搜索模块包含:

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);
bind(PersonSearch.class).to(PersonElasticSearch.class); 
ElasticSearch模块包含:

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);
bind(PersonSearch.class).to(PersonElasticSearch.class); 
是否有一种方法可以创建一个包含数据库搜索模块的PlaceSearch绑定和ElasticSearch模块的PersonSearch绑定的注入器,而无需创建包含

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

??这是Modules.override()的情况吗?一个关于createChildInjector的案例?提前谢谢

对于
模块.override()
,这是一个完美的例子

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

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

让我们说:

DatabaseSearchModule.java(扩展PrivateModule)

EleasticSearchModule.java(扩展私有模块)

那么,您可以将其安装在某个父抽象或servlet模块中

MainModule.java

install(new DatabaseSearchModule());
install(new EleasticSearchModule());

bind(OtherClass.class);
@Inject @Named("elastic")
private PlaceSearch elasticSearch;
@Inject @Named("dbSearch")
private PlaceSearch dbSearch;
OtherClass.java

install(new DatabaseSearchModule());
install(new EleasticSearchModule());

bind(OtherClass.class);
@Inject @Named("elastic")
private PlaceSearch elasticSearch;
@Inject @Named("dbSearch")
private PlaceSearch dbSearch;

您可以使用
命名的
注释,也可以创建非常优雅的自己的绑定。

谢谢您的回答。你能给我解释一下儿童注射器到底是什么吗?或者给我指一个好的推荐人?我不确定我是否完全理解儿童注入器的概念。儿童注入器的概念在以下回答中得到了很好的解释: