@Autowired与Constructor一起使用

时间:2018-05-16 04:56:56

标签: constructor spring-data-jpa autowired

这让我长期困惑。我一直想知道如何方便地使用它们。

我今天真的倒霉了:

@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;
}

目前,我认为我还有两种方法:

  1. 使用@Autowired和原始基元Constructor来创建实例;
  2. 使用其他方法而不是@Autowired来管理存储库。
  3. 任何人都可以分享一些想法或线索。

    非常感谢!

1 个答案:

答案 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);
    }
}
相关问题