O documento discute o padrão Dependency Injection, que tem como objetivo desacoplar classes e componentes através da injeção de dependências. Ele apresenta exemplos iniciais de implementação e explica os três principais tipos de injeção de dependência: por construtores, por métodos set e por interfaces. Também mostra exemplos de implementação com os frameworks PicoContainer e Spring.
2. Introdução
* Padrão comum entre frameworks
* Objetivo de fazer a amarração entre componentes
* Frameworks começam a fornecer soluções
3. Exemplo inicial
class MovieLister...
public Movie[] moviesDirectedBy(String arg) {
List allMovies = finder.findAll();
for (Iterator it = allMovies.iterator(); it.hasNext();) {
Movie movie = (Movie) it.next();
if (!movie.getDirector().equals(arg))
it.remove();
}
return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
}
4. Extraindo uma interface e criando implementação
public interface MovieFinder{
List findAll() ;
}
class MovieLister...
private MovieFinder finder;
public MovieLister () {
finder = new ColonDelimitedMovieFinder("movies1.txt");
}
6. Injeção de dependências
- Ter um objeto separado, o montador (assembler).
- Popula um campo em um objeto (lister) com uma
implementação apropriada para uma interface (finder).
Existem três tipos principais
- Constructor Injection (Injeção por Construtores)
- Setter Injection (Injeção por Métodos Set)
- Interface Injection (Injeção por Interfaces).
7. Exemplo com PicoContainer
class MovieLister... class ColonMovieFinder...
public MovieLister(MovieFinder finder) { public ColonMovieFinder(String filename) {
this.finder = finder; this.filename = filename;
} }
private MutablePicoContainer configureContainer() {
MutablePicoContainer pico = new DefaultPicoContainer();
Parameter[] finderParams = { new ConstantParameter("movies1.txt")};
pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
pico.registerComponentImplementation(MovieLister.class);
return pico;
}
8. Exemplo com Spring
class MovieLister...
private MovieFinder finder; class ColonMovieFinder...
public void setFilename(String filename) {
public void setFinder (MovieFinder finder) { this.filename = filename;
this.finder = finder; }
}
<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name = "finder">
<ref local = "MovieFinder" / >
< / property>
< / bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name = "filename">
<value>movies1.txt< / value>
< / property>
< / bean>
< / beans>