cha*_*luo 6 java inheritance constructor dependency-injection guice
可能重复:
与父母的Guice
class Book{string title;}
class ChildrensBook extends Book{}
class ScienceBook extends Book{}
Run Code Online (Sandbox Code Playgroud)
我想将书名注入子类中,例如,childrensBook应该为"爱丽丝梦游仙境"分配标题,并且ScienceBook应该获得"物种起源".我如何用Guice实现这一目标?
(注意我不想覆盖title子类中的字段)
埋藏在Guice最佳实践的最小可变性部分中,您将找到以下指南:
子类必须调用
super()所有依赖项.这使构造函数注入变得麻烦,尤其是当注入的基类发生变化时.
在实践中,以下是使用构造函数注入的方法:
public class TestInheritanceBinding {
static class Book {
final String title;
@Inject Book(@Named("GeneralTitle") String title) {
this.title = title;
}
}
static class ChildrensBook extends Book {
@Inject ChildrensBook(@Named("ChildrensTitle") String title) {
super(title);
}
}
static class ScienceBook extends Book {
@Inject ScienceBook(@Named("ScienceTitle") String title) {
super(title);
}
}
@Test
public void bindingWorked() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override protected void configure() {
bind(String.class).
annotatedWith(Names.named("GeneralTitle")).
toInstance("To Kill a Mockingbird");
bind(String.class).
annotatedWith(Names.named("ChildrensTitle")).
toInstance("Alice in Wonderland");
bind(String.class).
annotatedWith(Names.named("ScienceTitle")).
toInstance("On the Origin of Species");
}
});
Book generalBook = injector.getInstance(Book.class);
assertEquals("To Kill a Mockingbird", generalBook.title);
ChildrensBook childrensBook = injector.getInstance(ChildrensBook.class);
assertEquals("Alice in Wonderland", childrensBook.title);
ScienceBook scienceBook = injector.getInstance(ScienceBook.class);
assertEquals("On the Origin of Species", scienceBook.title);
}
}
Run Code Online (Sandbox Code Playgroud)
你最好的选择可能是用不同的参数注释编写子类构造函数——比如
class ChildrensBook extends Book {
@Inject ChildrensBook (@AliceInWonderland String title) {
super(title);
}
}
Run Code Online (Sandbox Code Playgroud)