TransWikia.com

Implicações de @Autowired em construtor e fora

Stack Overflow em Português Asked by Daniela Morais on September 26, 2021

Ao trabalhar com Spring percebo dois padrões de utilizar o @Autowired, declarar dentro do construtor e fora.

Construtor

@Service
public class myService { 
    private final PartnerRepository partnerRepository;
    private final RequestorRepository requestorRepository;

    @Autowired
    public myService(PartnerRepository partnerRepository, RequestorRepository requestorRepository) {
        this.partnerRepository = partnerRepository;
        this.requestorRepository = requestorRepository;
    }

Sem construtor

@Service
public class myService { 
        @Autowired
        PartnerRepository partnerRepository;
        @Autowired 
        RequestorRepository requestorRepository;

        //methods
}

Qual a utilidade de cada um dos casos e por quê preferir um ao invés do outro? Pessoalmente sempre utilizei fora do construtor apenas parecer mais elegante.

A única implicação direta que percebi foi para testes unitários com Mockito e JUnit, ao utilizar fora do construtor é necessário utilizar @Spy (resposta no SOen) e ao utilizar no construtor é possível fazer uma instanciação direta com o new.

 MyService myService = Mockito.spy(new MyService(partnerRepository, requestorRepository));

One Answer

Todas as formas servem para o mesmo objetivo, e se obtém o mesmo resultado final. A vantagem de ser no construtor é:

  • Identificar explicitamente quais as dependências
  • As dependências podem ser final
  • Facilita na criação de testes. Fica mais fácil injetar mocks, você pode fazer isso usando o próprio construtor da classe, não necessitando de reflexão.

Usar um ou outro fica na sua escolha.

Answered by Humberto Machado on September 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP