Когда происходит инъекция базового класса в Micronaut? - PullRequest
0 голосов
/ 22 февраля 2020

Я использую наследование с микронавтом. У меня есть приложение, которое делает что-то похожее на следующее

@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.

1 Ответ

1 голос
/ 22 февраля 2020

Я хотел бы знать, почему значение по-прежнему равно нулю, и если наследование является анти-паттерном в micronaot.

Наследование не является анти-паттерном в Micronaut.

Проблема, с которой вы столкнулись, не имеет никакого отношения к Микронавту. Это больше связано с тем, как распределяются объекты. Вы ссылаетесь на value в конструкторе Parent, но к этому моменту инициализация value невозможна. Код, который инициализирует свойство value, не может быть выполнен до тех пор, пока не будет инициализирован экземпляр Parent, но вы пытаетесь сослаться на value до того, как это произойдет. Вы бы увидели то же самое поведение, если бы вы оставили Микронавт вне его и просто вызвали new Parent();.

Неясно, что вам нужно сделать для объекта value, когда строится Parent, но один вариант рассмотреть вместо этого:

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
    }
}
...