@Autowired используется с конструктором - PullRequest
0 голосов
/ 16 мая 2018

Это смущало меня долго. Мне было интересно, как мне удобно работать с ними обоими.

Я действительно упал в это сегодня:

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

Пока, думаю, у меня есть два пути:

  1. работа с @Autowired и оригинальным примитивом Constructor для создания экземпляра;
  2. управлять хранилищем, используя другие методы вместо @Autowired.

Может кто-нибудь поделиться, пожалуйста, некоторыми идеями или подсказками.

Большое спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Используя @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);
    }
}
...