Это смущало меня долго. Мне было интересно, как мне удобно работать с ними обоими.
Я действительно упал в это сегодня:
@Slf4j
@Service
public abstract class ServiceParserAbstract {
private KubeServiceRetriever kubeServiceRetriever;
public ServiceParserAbstract initialize(KubeServiceRetriever kubeServiceRetriever) {
this.kubeServiceRetriever = kubeServiceRetriever;
return this;
}
}
Я пытался использовать @Autowired
в абстрактном классе напрямую, но это не удалось с NPE при попытке доступа.
А потом я подумал, что, возможно, я смогу поместить этих @Autowired
до потомков следующим образом, а затем использовать @PostConstruct
для доступа к нему.
@Component
public class Service8Parser extends ServiceParserAbstract {
@Autowired
private KubeServiceRetriever kubeServiceRetriever;
@PostConstruct
public ServiceParserAbstract getInstance() {
return initialize(kubeServiceRetriever);
}
}
public class ServiceParserFactory {
public static Optional<ServiceParserAbstract> getParser(ServiceVersionEnum versionEnum) {
switch (versionEnum) {
case VERSION_8:
return Optional.of(new Service8Parser().getInstance());
case VERSION_8_EARLIER:
return Optional.of(new Service8EarlierParser());
default:
break;
}
return Optional.empty();
}
}
Тем не менее я потерпел неудачу и понятия не имею, что происходит.
Почему я просто должен использовать @Autowired
во всех этих попытках. Потому что я не знаю, как использовать JPA , когда не используется @Autowired
.
public class KubeServiceRetriever {
@Autowired
private EnvironmentUsageRepository environmentUsageRepository;
}
Пока, думаю, у меня есть два пути:
- работа с
@Autowired
и оригинальным примитивом Constructor
для создания экземпляра;
- управлять хранилищем, используя другие методы вместо
@Autowired
.
Может кто-нибудь поделиться, пожалуйста, некоторыми идеями или подсказками.
Большое спасибо!