Sobes.tech
Junior

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

sobes.tech IA

Resposta da IA

Existem três tipos principais de injeção de dependências:

  1. Injeção através do construtor (Constructor Injection): As dependências são fornecidas à classe através do seu construtor. A classe não pode ser criada sem fornecer todas as dependências necessárias. Isto garante uma especificação clara das dependências e facilita os testes.

    public class SomeService {
    
        private final Dependency dependency;
    
        public SomeService(Dependency dependency) { // Injeção através do construtor
            this.dependency = dependency;
        }
    
        public void doSomething() {
            dependency.execute();
        }
    }
    
  2. Injeção através do setter (Setter Injection): As dependências são fornecidas à classe através de métodos públicos setters. Isto torna a classe mais flexível em termos de configuração, mas não garante a provisão de todas as dependências na criação do objeto.

    public class AnotherService {
    
        private Dependency dependency;
    
        public void setDependency(Dependency dependency) { // Injeção através do setter
            this.dependency = dependency;
        }
    
        public void doSomethingElse() {
            if (dependency != null) {
                dependency.execute();
            } else {
                // Lidar com o caso de dependência ausente
            }
        }
    }
    
  3. Injeção através da interface (Interface Injection): Menos comum, onde a classe dependente deve implementar uma interface que fornece um setter para a dependência. O injetor usa esta interface para fornecer a dependência.

    // Interface que define o método para injetar a dependência
    public interface DependencyInjectable {
        void setDependency(Dependency dependency);
    }
    
    public class YetAnotherService implements DependencyInjectable {
    
        private Dependency dependency;
    
        @Override
        public void setDependency(Dependency dependency) { // Implementação do método da interface
            this.dependency = dependency;
        }
    
        public void performAction() {
            if (dependency != null) {
                dependency.execute();
            }
        }
    }
    

Comparação dos métodos:

Método Vantagens Desvantagens Casos de uso típicos
Através do construtor Especificação clara de dependências, imutabilidade Muitas dependências podem levar a um construtor "inchado" Dependências obrigatórias, criação de objetos imutáveis
Através do setter Dependências opcionais, flexibilidade de configuração Não garante a presença da dependência, estado modificável Dependências opcionais, herança, configuração após criação
Através da interface Menos comum Complexidade adicional Cenários raros que requerem um método de injeção padronizado

A abordagem mais preferida na maioria dos casos é a injeção através do construtor, especialmente para dependências obrigatórias, pois define claramente o contrato da classe e favorece a criação de objetos em um estado correto. A injeção através do setter é conveniente para dependências opcionais ou quando há muitas dependências para evitar construtores longos. A injeção através da interface é menos comum e pode ser útil em frameworks específicos ou quando é necessário padronizar o processo de injeção.