Que tipos de injeção de dependências conhece?
sobes.tech IA
Resposta da IA
Existem três tipos principais:
-
Injeção de campo (Field Injection): A dependência é injetada diretamente no campo da classe usando uma anotação (por exemplo,
@Autowiredno Spring). É fácil de usar, mas dificulta os testes unitários e viola o princípio de responsabilidade única, ocultando as dependências.// Exemplo de injeção de campo public class MyService { // A dependência é injetada diretamente no campo @Autowired private MyRepository repository; public void doSomething() { repository.getData(); } } -
Injeção por setter (Setter Injection): A dependência é injetada através de um método setter público. Permite que a dependência seja opcional (não obrigatória de definir), conveniente para alterar dependências em tempo de execução (embora raramente usado). Não cria uma dependência obrigatória ao criar o objeto.
// Exemplo de injeção por setter public class MyService { private MyRepository repository; // A dependência é injetada via setter @Autowired public void setRepository(MyRepository repository) { this.repository = repository; } public void doSomething() { repository.getData(); } } -
Injeção por construtor (Constructor Injection): A dependência é injetada através do argumento do construtor. É preferível, pois garante que a dependência seja obrigatória (sem ela, o objeto não pode ser criado), facilita os testes unitários (fácil de passar objetos mock) e declara claramente as necessidades da classe. Faz objetos imutáveis após a criação se os campos forem final.
// Exemplo de injeção por construtor public class MyService { private final MyRepository repository; // Campo pode ser final // A dependência é injetada via o construtor @Autowired // Em versões recentes do Spring, pode omitir esta anotação se houver apenas um construtor public MyService(MyRepository repository) { this.repository = repository; } public void doSomething() { repository.getData(); } }
Tabela comparativa:
| Tipo de injeção | Obrigatoriedade da dependência | Facilidade de uso | Testabilidade | Imutabilidade |
|---|---|---|---|---|
| Através do campo | Opcional (oculto) | Alta | Baixa | Não |
| Através do setter | Opcional | Média | Média | Não |
| Através do construtor | Obrigatório | Média | Alta | Possível |
Na maioria dos casos, recomenda-se usar a injeção via construtor.