我一直在寻找关于注入器层次结构以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释。
这是我的用例:
例如,假设数据库搜索模块包含:
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的案例?提前谢谢!
答案 0 :(得分:4)
Modules.override()
无效Stage.PRODUCTION
。您应该使用PrivateModule
绑定在私有模块内有效/可见,因此您可以将不同的实现类绑定到同一个接口。然后,您可以将Private模块安装到父模块,但您必须显式expose()
要使其他模块可见的所有绑定。
让我们说:
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
注释,也可以创建非常优雅的自己绑定Annotation。
答案 1 :(得分:2)
这是Modules.override()
的完美案例。
大多数应用程序不应使用儿童注射器。它们增加了很多配置复杂性,并且对于极端情况有一些令人惊讶的行为。