Sobes.tech
Junior

Que tipos de injeção de dependências conhece?

sobes.tech IA

Resposta da IA

Existem três tipos principais:

  1. Injeção de campo (Field Injection): A dependência é injetada diretamente no campo da classe usando uma anotação (por exemplo, @Autowired no 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();
        }
    }
    
  2. 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();
        }
    }
    
  3. 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.