这让我长期困惑。我一直想知道如何方便地使用它们。
我今天真的倒霉了:
@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
。因为我不知道如何在不使用@Autowired
时使用 JPA 。
public class KubeServiceRetriever {
@Autowired
private EnvironmentUsageRepository environmentUsageRepository;
}
目前,我认为我还有两种方法:
@Autowired
和原始基元Constructor
来创建实例; @Autowired
来管理存储库。 任何人都可以分享一些想法或线索。
非常感谢!
答案 0 :(得分:0)
在整个过程中使用@Autowired
,它可以正常工作。
@Component
public class ServiceParserFactory {
@Autowired
private Service8Parser service8Parser;
public Optional<ServiceParserAbstract> getParser(ServiceVersionEnum versionEnum) {
switch (versionEnum) {
case VERSION_8:
return Optional.of(service8Parser);
default:
break;
}
return Optional.empty();
}
}
@Slf4j
@Service
public abstract class ServiceParserAbstract {
@Autowired
private KubeServiceRetriever kubeServiceRetriever;
}
@Service
public class Service8Parser extends ServiceParserAbstract {
}
@Component
public class ServiceParser {
@Autowired
private ServiceParserFactory serviceParserFactory;
private ServiceParserAbstract serviceParser;
public ServiceDo parseService(Long envId, String serviceName) throws RetrieverException {
serviceParser = serviceParserFactory.getParser(ServiceVersionEnum.VERSION_8).get();
return serviceParser.parseSingleService(envId, serviceName);
}
}