Java 喷油器层次结构/子喷油器说明?
我一直在网上寻找有关injector继承权以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释 以下是我的用例:Java 喷油器层次结构/子喷油器说明?,java,guice,Java,Guice,我一直在网上寻找有关injector继承权以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释 以下是我的用例: 我有一个基本的应用程序模块,用于注入特定的上下文项。该模块应包含在每个喷油器实例中 我有一个搜索模块,搜索数据库 我有一个搜索模块,搜索ElasticSearch。此类中的某些绑定应覆盖数据库搜索模块中提供的绑定 例如,假设数据库搜索模块包含: bind(PlaceSearch.class).to(HibernatePlaceSearch.
- 我有一个基本的应用程序模块,用于注入特定的上下文项。该模块应包含在每个喷油器实例中
- 我有一个搜索模块,搜索数据库
- 我有一个搜索模块,搜索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;
您可以使用
命名的注释,也可以创建非常优雅的自己的绑定。谢谢您的回答。你能给我解释一下儿童注射器到底是什么吗?或者给我指一个好的推荐人?我不确定我是否完全理解儿童注入器的概念。儿童注入器的概念在以下回答中得到了很好的解释: