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...");
}
}