NotificationCenter
не реальный класс, а абстрактный класс, поэтому вы не можете создать его экземпляр. С другой стороны, у него есть поле (последнее поле!) EmailService
, которое должно быть инициализировано в конструкторе! Сеттер здесь не будет работать, потому что последнее поле инициализируется ровно один раз. Это Java, даже не Spring.
Любой класс, который расширяет NotificationCenter
, наследует поле EmailService, потому что этот дочерний элемент "является" центром уведомлений
Итак, вы должны предоставить конструктор, который получает экземпляр службы электронной почты и передает его в super для инициализации. Это опять Java, а не Spring.
public class NotificationCenterA extends NotificationCenter {
private final TemplateBuildingService templateBuildingService;
public NotificationCenterA(EmailService emailService, TemplateBuildingService templateBuildingService) {
super(emailService);
this.templateBuildingService = templateBuildingService;
}
}
Теперь Spring управляет бобами для вас, он инициализирует их и вводит зависимости.
Вы пишете что-то, что, честно говоря, я не понимаю:
... как первый оператор для конструктора NotificationCenterA, но у меня нет экземпляра emailService, и я не собираюсь заполнять базовое поле от дочерних элементов.
Но Spring будет управлять только NotificationCenterA
bean-компонентом (и, конечно, реализацией EmailService), он не управляет абстрактным классом, и, поскольку Java накладывает ограничения (по причине), описанной выше, я думаю, что прямой ответ Ваш вопрос будет:
- В этом случае нельзя использовать инъекцию сеттера (опять же, из-за final, это Java, а не из-за Spring)
- Внедрение в конструктор, которое в общем случае лучше, чем вложение в сеттер, может точно обработать ваш случай