如何创建使用guice工厂辅助注入创建的类的实例并从抽象类扩展?

时间:2016-07-15 10:24:13

标签: java guice

我有以下的hirarchy:

~interface Car

  ~ abstract class SportsCar

     ~ class Ferrari

我使用FerrariFactory创建了一个类法拉利的实例(模块中的代码如下所示):

install(new FactoryModuleBuilder().build(FerrariFactory.class));

FerrariFactory界面有以下方法,我使用辅助注射来注射零件(这是包含所有零件的xml元件,即法拉利特定零件+跑车零件):

Ferrari create(@Assisted Element partsElement);

当我创建法拉利实例时,我使用以下内容:

ferrariFactory.create(partsElement);

首先调用法拉利构造函数:

   @Inject
public Ferrari(Element parts) {
    super(parts);
    this.ferrariRadio= getElementValue(parts, "Parts/FerrariParts/ferrariRadio");
}

由于第一行是对SportsCar的超类构造函数的调用:

        public SportsCar (Element parts) {
        super();
        System.out.println("SportsCarconstructor: 1");
        System.out.println("SportsCarconstructor: 2 "+parts);
...
... // where I set the basic parts from the parts xml element
}

由于SportsCar是一个摘要,我在guice模块中没有约束力。我不知道如何绑定它。另外,我在SportsCar构造函数的第二个sysout行得到一个NullPointerException,即使我没有通过null访问任何东西(奇怪的空指针)。

关于它是否是绑定问题或为什么我的abstractclass构造函数无法设置部件的任何建议?

1 个答案:

答案 0 :(得分:0)

确定。找到了答案。我错过了两件事:

<强> 1。错过了法拉利构造函数中的@Assisted注释:

    @Inject
    public Ferrari(@Assisted Element parts) {
     super(parts);
....
    }

<强> 2。我可以在模块中声明抽象类和实现,如下所示:

install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));