Tags:
create new tag
, view all tags

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

Topic revision: r4 - 2009-03-17 - FernandaDamorim
 
This site is powered by the TWiki collaboration platformCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback

mersin escort bayan adana escort bayan izmit escort ankara escort bursa escort