Guice能否注入带有@SuperBuilder注解的类的依赖实例?
结论
Guice 无法自动解析得到两个子类的实例,你需要额外编写逻辑提供子类实例。
原因
- 你为
BaseClass和两个子类添加的@SuperBuilder注解仅会生成对应建造者模式的相关代码,不会生成带@Inject注解的构造方法,Guice没有默认途径实例化ChildClass1和ChildClass2。 - 你编写的
List<BaseClass>的@Provides方法的参数ChildClass1 c1、ChildClass2 c2属于方法注入的依赖,Guice需要先能获取这两个类的实例才能调用该方法生成List。
解决方案
你可以选择以下任意一种方式完成子类实例的提供:
方案1:为子类添加注入构造注解
给两个子类添加Lombok的构造注解,指定生成带@Inject的构造方法,注意需要包含父类的final字段:
@SuperBuilder @AllArgsConstructor(onConstructor = @__(@Inject)) public class ChildClass1 extends BaseClass { DependencyA depA; } @SuperBuilder @AllArgsConstructor(onConstructor = @__(@Inject)) public class ChildClass2 extends BaseClass { DependencyB depB; }
方案2:单独编写子类的@Provides方法
直接在Guice模块中编写子类实例的提供逻辑,复用已有的@SuperBuilder能力:
@Provides public ChildClass1 provideChildClass1(DependencyA depA, DependencyC depC) { return ChildClass1.builder() .depC(depC) .depA(depA) .build(); } @Provides public ChildClass2 provideChildClass2(DependencyB depB, DependencyC depC) { return ChildClass2.builder() .depC(depC) .depB(depB) .build(); }
注意:你贴出的子类定义存在笔误,两个子类都命名为了
ChildClass1,请修正为ChildClass1和ChildClass2避免编译错误。
内容的提问来源于stack exchange,提问作者Anit Aggarwal
相关产品推荐
相关产品推荐

