qual é a melhor maneira de autowire campo classe pai na primavera?

Wang louvor:

Quando eu uso Spring Framework, eu encontrar algo que deve ser extrato, por exemplo, o componente de serviço (ou variável de membro que é autowired). Código mostrar como abaixo:

abstract class Payment {

    PaymentService paymentService;

    void setPaymentService(OrderPaymentService paymentService) {
        this.paymentService = paymentService;
    }

}    

@Component
public class CancelPayment extends Payment{
    private OtherService2 otherSerivce2;

    @Autowired
    @Override
    public void setPaymentService(PaymentService paymentService) {
        super.setPaymentService(paymentService);
    }

    @Autowired
    public CancelPayment(OtherService2 s2) {
        this.otherSerivce2 = s2;
    }
}

@Component
public class CreatePayment extends Payment{
    private OtherService1 otherSerivce1;

    @Autowired
    @Override
    public void setPaymentService(PaymentService paymentService) {
        super.setPaymentService(paymentService);
    }

    @Autowired
    public CreatePayment (OtherService1 s1) {
        this.otherSerivce1 = s1;
    }
}

Como você pode ver, eu uso injeção de setter em cada classe criança. Essa é uma prática melhor do que variável de membro do autowire seus pais?

IvanM:

Aqui estão as diretrizes DI por equipa da Primavera:


A orientação geral, que é recomendado pela Spring (veja as seções sobre DI baseado em Construtor ou DI baseada em setter) é o seguinte:

  • Para dependências obrigatórias ou quando se aponta para a imutabilidade, a injeção de uso construtor

  • Para dependências opcionais ou mutáveis, injecção uso Setter

  • injeção Evite campo na maioria dos casos


Agora, se você tem certeza que você irá usar PaymentService eu sugiro que você use injeção de construtor em sua classe abstrata como este para objeto não instanciar sem dependência, também tornando-o mais imutável, mais clara e thread-safe:

abstract class Payment {
    PaymentService paymentService;


    public Payment(OrderPaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

Em seguida, você pode simplesmente chamar de super em suas classes estendidas como este:

@Component
public class CreatePayment extends Payment{
    private OtherService1 otherSerivce1;

    @Autowired
    public CreatePayment(PaymentService paymentService) {
        super(paymentService);
    }
}

Isso simplesmente permite injetar classe pai usando construtor (se paymentService é obrigatório).

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=167840&siteId=1
Recomendado
Clasificación