Dependency Injection - Injeção de Dependência
A principal idéia de injeção de dependência é desacoplar o cliente dos serviços providos por algum sistema. Em outras palavras, não há referência explícita entre tais membros.
Implementação de Variações usando Dependency Injection - Spring
O exemplo a seguir está disponível como um projeto do eclipse
aqui. Para rodar o exemplo, execute o teste em JUnit MovieListerTest.
Vamos considerar um serviço que busca filmes em repositórios. Assim, quem implementa a interface MovieFinder tem o serviço de buscar filmes em um determinado repositório.
public interface MovieFinder {
String[] findAllMovies();
}
A classe a seguir implementa esta interface. É importante salientar a variação aqui. Para efeito de ilustração, a classe abaixo busca filmes e retorna um simples array de String. Mas é importante ter em mente que uma possível variação da Linha de Produtos seria buscar filmes em repositórios como bancos de dados, arquivos etc.
public class MarcioMovieFinder implements MovieFinder {
public String[] findAllMovies() {
return new String[]{"Jogos Mortais", "Uma saída de mestre", "Sob suspeita"};
}
}
Os códigos acima mostram o serviço de buscar filmes. Mas como chamá-lo (através de uma classe cliente) sem ter uma referência direta para o tipo de busca de filmes? A idéia de não possuir uma referência direta é prover um baixo acoplamento entre a classe cliente e o código que busca filmes.
Com
Dependency Injection é possível remover essas referências diretas. A classe abaixo possui uma referência para a interface MovieFinder. A idéia é que o container do Spring (ou qualquer outro container) instancie o buscador de filmes escolhido e chame o método setFinder passando o referido buscador automaticamente. Assim sendo, clientes que chamam o método getMovies não terão conhecimento algum acerca do buscador de filmes escolhido.
public class MovieLister {
private MovieFinder finder;
// Dependency Injection: o spring injeta uma implementacao concreta
// do finder sem MovieLister conhece-la.
public void setFinder(MovieFinder finder) {
this.finder = finder;
}
public String[] getMovies() {
return finder.findAllMovies();
}
}
Mas como é feita a escolha do buscador de filmes? No container Spring, há um arquivo XML para a configuração de
Dependency Injection.
<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="client.MarcioMovieFinder">
</bean>
</beans>
Basicamente, o arquivo acima define duas coisas: qual o atributo (finder) da classe MovieLister que receberá o buscador de filmes. Neste caso, o atributo finder será uma referência para o bean cujo id é MovieFinder. Neste exemplo, o buscador de filmes cujo id é MovieFinder é a classe MarcioMovieFinder.
Referência: Martin Fowler, Inversion of Control Containers and the Dependency Injection pattern, URL:
http://martinfowler.com/articles/injection.html
--
FernandaDamorim - 17 Mar 2009 --
LeopoldoTeixeira - 02 Sep 2008 --
MarcioRibeiro - 02 Sep 2008