我一直在寻找关于注入器层次结构以及如何/何时使用createChildInjector()的解释,但我找不到清晰简洁的解释.
这是我的用例:
例如,假设数据库搜索模块包含:
bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);
Run Code Online (Sandbox Code Playgroud)
ElasticSearch模块包含:
bind(PersonSearch.class).to(PersonElasticSearch.class);
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个注入器,包括来自数据库搜索模块的PlaceSearch绑定和来自ElasticSearch模块的PersonSearch绑定,而无需创建包含的单独模块
bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(PersonElasticSearch.class);
Run Code Online (Sandbox Code Playgroud)
?这是Modules.override()的情况吗?createChildInjector的案例?提前谢谢!
无法Modules.override()在 中工作Stage.PRODUCTION。您应该使用PrivateModule绑定仅在私有模块内有效/可见的位置,这样您就可以将不同的实现类绑定到同一接口。然后,您可以将私有模块安装到父模块,但是您必须显式地显式地显示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"));
Run Code Online (Sandbox Code Playgroud)
EleasticSearchModule.java(扩展 PrivateModule)
bind(PersonSearch.class).annotatedWith(Names.named("elastic")).to(PersonElasticSearch.class);
expose(PersonSearch.class).annotatedWith(Names.named("elastic"));
Run Code Online (Sandbox Code Playgroud)
那么你可以将它安装在一些父抽象或 servlet 模块中
主模块.java
install(new DatabaseSearchModule());
install(new EleasticSearchModule());
bind(OtherClass.class);
Run Code Online (Sandbox Code Playgroud)
其他类.java
@Inject @Named("elastic")
private PlaceSearch elasticSearch;
@Inject @Named("dbSearch")
private PlaceSearch dbSearch;
Run Code Online (Sandbox Code Playgroud)
您可以使用Named注释,也可以创建非常优雅的自己的绑定注释。