Percebi que tem duas maneiras de injetar as classes colocando a anotação @Autowired e passando pelo construtor, gostaria de saber se tem alguma diferença entre os dois jeitos de fazer
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Percebi que tem duas maneiras de injetar as classes colocando a anotação @Autowired e passando pelo construtor, gostaria de saber se tem alguma diferença entre os dois jeitos de fazer
Olá, Bruno! Excelente pergunta, mostra que você está atento aos detalhes!
A injeção de dependências pode ser feita de duas formas no Spring, como você bem observou: através da anotação @Autowired e pela injeção via construtor. Ambas têm o mesmo objetivo que é instanciar um objeto automaticamente para você.
A anotação @Autowired é a maneira mais antiga e mais comum de fazer isso. Você a coloca acima do atributo que deseja que o Spring instancie para você.
Por exemplo:
@Autowired
private AgendaDeConsultas agenda;
Por outro lado, a injeção via construtor é uma abordagem mais moderna e é considerada uma boa prática atualmente. Nesse caso, você declara as dependências no construtor da classe e o Spring cuida de instanciá-las para você. Isso facilita a escrita de testes unitários e torna o código mais limpo e fácil de entender.
Por exemplo:
private AgendaDeConsultas agenda;
public SuaClasse(AgendaDeConsultas agenda) {
this.agenda = agenda;
}
Nesse caso, não é necessário o uso da anotação @Autowired, o Spring reconhece automaticamente que precisa injetar as dependências quando elas são declaradas no construtor.
As duas abordagens fazem a mesma coisa, mas a injeção via construtor é considerada uma prática melhor e mais moderna, embora atualmente as bibliotecas de testes automatizados, como Mockito, consigam também injetar mocks mesmo sem um construtor na classe sendo testada.
Bons estudos!