Injeção de Dependência via Construtor em Java

Este artigo demonstra a implementação de injeção de dependência utilizando construtores, contrsatando com a abordagem de injecção por setter. A classe principal, como o computador, recebe a dependência diretamente no construtor, facilitando a configuração e o teste.

Estrutura do Projeto

O exemplo inclui uma interface de impressora, implementações concretas, uma classe para carregar beans de um arquivo de configruação, e classes de teste.

Interface do Dispositivo de Impressão

public interface DispositivoImpressao { void inicializar(); void imprimir(String texto); }


</div>### Implementação de Impressora Colorida

<div>```
package org.dependencyinjection.printer;

public class ImpressoraCor implements DispositivoImpressao {
    @Override
    public void inicializar() {
        System.out.println("Iniciando impressora colorida!");
    }

    @Override
    public void imprimir(String texto) {
        System.out.println("Imprimindo em cores: ".concat(texto));
    }
}

public class ImpressoraMonocromatica implements DispositivoImpressao { @Override public void inicializar() { System.out.println("Iniciando impressora preto e branco"); }

@Override
public void imprimir(String texto) {
    System.out.println("Imprimindo em preto e branco: ".concat(texto));
}

}


</div>### Classe para Carregar Configurações de Beans

<div>```
package org.dependencyinjection.printer;

import java.io.IOException;
import java.util.Properties;

public class CarregadorBeans {
    private static final Properties configuracoes = new Properties();
    
    static {
        try {
            configuracoes.load(CarregadorBeans.class.getResourceAsStream("/beans.properties"));
        } catch (IOException excecao) {
            throw new RuntimeException("Falha ao carregar o arquivo de configuração", excecao);
        }
    }

    public static Object obterInstancia(String chave) {
        String nomeClasse = configuracoes.getProperty(chave);
        try {
            return Class.forName(nomeClasse).getDeclaredConstructor().newInstance();
        } catch (Exception excecao) {
            throw new RuntimeException("Erro ao instanciar a classe: " + nomeClasse, excecao);
        }
    }
}

public class Computador { private final DispositivoImpressao dispositivo;

public Computador(DispositivoImpressao dispositivo) {
    this.dispositivo = dispositivo;
}

public void executarImpressao(String mensagem) {
    dispositivo.inicializar();
    dispositivo.imprimir(mensagem);
}

}


</div>### Classe de Teste

<div>```
package org.dependencyinjection.printer;

public class TesteAplicacao {
    public static void main(String[] args) {
        DispositivoImpressao impressora = (DispositivoImpressao) CarregadorBeans.obterInstancia("impressora");
        Computador pc = new Computador(impressora);
        pc.executarImpressao("Imprimindo página de teste...");
    }
}

Tags: java Injeção de Dependência Construtor Injeção Orientação a Objetos Configuração Dinâmica

Publicado em 6-13 23:32 por Thomas