Base Class 注入什么时候发生在 Micronaut 中

When does Base Class Injection happen in Micronaut

我在 micronaut 中使用继承。我有一个应用程序执行类似于以下内容的操作

@Prototype
class ValueHolder {
    public void doSomthing();
}

@Prototype
class Base {
    @Inject
    ValueHolder value;

    Base() {
        // Does Something
    }

}

@Prototype
class Parent extends Base {

    Parent() {
         super()
         value.doSomthing(); // NullPointerException
    }
}

我想知道为什么 value 仍然是 null 以及继承是否是 micronaot 中的反模式。

I would like to know why value is still null and if inheritance is an anti-pattern in micronaot.

继承不是 Micronaut 中的反模式。

您遇到的问题与 Micronaut 没有任何关系。它更多地与对象的分配方式有关。您在 Parent 构造函数中引用了 valuevalue 不可能在那时被初始化。初始化 value 属性 的代码在初始化 Parent 实例之前无法执行,但您正试图在此之前引用 value。如果您将 Micronaut 排除在外并简单地调用 new Parent();.

,您会看到相同的行为

不清楚在构造 Parent 时需要 value 对象做什么,但要考虑的一个选项是:

import io.micronaut.context.annotation.Prototype;

@Prototype
class Base {
    ValueHolder value;

    Base(ValueHolder value) {
        this.value = value;
    }

}
import io.micronaut.context.annotation.Prototype;

@Prototype
class Parent extends Base {

    Parent(ValueHolder value) {
        super(value);
        value.doSomthing(); // Not NullPointerException
    }
}