You are on page 1of 5

Spring Framework Parte 1 -> Dependency Injection

By Felipe Saab

Quem dessa rea e nunca ouviu falar de Spring Framework por favor levante a mo.. timo, todo mundo pelo menos j ouviu falar desse tal de Spring. Durante esta srie de tutoriais eu vou demonstrar o que , pra que server e como vc pode utilizar o Spring para facilitar seus projetos. Primeiramente, o que esse tal de Spring afinal de contas? Spring um framework que propicia um container para sua aplicao, ou seja, sua aplicao roda em cima do container do Spring. Tal container prov principalmente a Injeo de Dependncia (ou Inverso de Controle, como era conhecido anteriormente) e a Programao Orientada a Aspectos. Nesta primeira parte eu vou falar sobre o padro Injeo de Dependncia e os benefcios que ele prov. Vamos l ento: O padro de projeto Injeo de Dependncia diz que uma classe no deve criar as suas dependncias, em outras palavras, uma classe no deve instanciar seus atributos. Ao invs disso, eles devem ser injetados na classe atravs de um mecanismo externo, ou atravs de quem criou o objeto desta classe. Ainda no est claro n Vamos a um exemplo (baseado em um dos exemplos do livro Spring in Action 2, 2008) para facilitar as coisas. Vamos imaginar que fomos contratados para desenvolver o software do dolos Spring?, uma competio de talentos musicais onde as pessoas cantam e/ou tocam. Primeiro de tudo vamos desenvolver uma interface genrica o suficiente para todos os nossos competidores: public interface Competidor public void apresentar(); }

Pronto, agora todo mundo que for competir no dolos Spring vai ter que implementar essa interface para poder participar ( quase como se fosse a inscrio da competio hahahahah pssima analogia.. ). Vamos ento aos competidores, vamos comear com um cantor. Um cantor no toca nenhum instrumento musical, ele apenas canta uma msica. Vamos ento interface que descreve uma msica: public interface Musica public void cantar(); }

Baseado na interface, j podemos criar uma msica: public class AtireiOPauNoGato implements Musica { private static String[] letra = { "Atirei o pu no gato t t", "Mas o gato t t", "No morreu reu reu", "Dona Chica c", "Admirou-se se", "Do berro, do berro que o gato deu", "Miau !!!!!!"}; public void cantar() { for (int i = 0; i < letra.length; i++) { System.out.println(letra[i]); } } }

Legal, algum vai cantar a famosa cantiga Atirei o pau no gato. Vamos codificar o cantor que ir fazer isso ento: public class Cantor implements Competidor { private Musica musica; public Cantor() { this.musica = new AtireiOPauNoGato(); } public void apresentar() { musica.cantar(); }

Prontinho. Agora toda vez que um cantor for se apresentar ele ir cantar Atirei o Pau no Gato. Mas pera ai, tem alguma coisa que no faz muito sentido aqui no tem? Ser que TODO cantor da nossa competio vai cantar a mesma msica? Acho que no n E do jeito que esta classe est implementada, ns temos que mudar a classe para ele cantar uma outra musica. Isso no l muito vivel O que a Injeo de Dependncia prega que ao invs de o cantor se preocupar em ficar preparando a msica que ele vai cantar, ele apenas vai receber a msica impressa um pouco antes da competio e pronto. Pensando nisso, o cantor ficaria assim: public class Cantor implements Competidor { private Musica musica; public Cantor() { } public void setMusica(Musica musica) { this.musica = musica; } public void apresentar() { musica.cantar(); } }

Pronto, o cantor j no est mais preparando a sua msica, pouco antes da apresentao ele vai receber a msica (atravs do setter) e vai cant-la (porque quem bom faz ao vivo! hehehe). Ok ok, at aqui no teve absolutamente NADA do tal do Spring, e vc provavelmente ainda no entendeu o porque desse monte de interfaces que parecem bobas no mesmo? Vamos l, advinhem quem vai dar a musica para o cantor? EXATO!! O container do Spring quem vai ser responsvel por entregar a msica para o nosso cantor, ou em termos mais tcnicos, o container quem faz toda a linkagem dos beans (cada objeto manipulado pelo container um bean, ex: uma musica, um cantor, um objeto que acessa o banco de dados, etc). Para ns vermos como isso tudo funciona (pq ngm gosta de bla bla bla), vou abrir o NetBeans 6.8, criar uma nova Aplicao Java e criar as interfaces e classes descritas at aqui. O NetBeans j traz as bibliotecas do Spring Framework junto com a IDE, o que te economiza um tempinho baixando-as. Clique com o boto direito na pasta Bibliotecas e cliquem Adicionar bliblioteca e adicione a biblioteca Spring Framework 2.5

Uma vez que o Spring j est no classpath ns j podemos criar um arquivo de configurao para descrever os beans da nossa aplicao. Toda a configurao do container feita atravs de arquivos XML.

Sendo assim eu criei mais um pacote (conf) e criei o arquivo idolos.xml dentro dele, este ser o arquivo que o Spring ir utilizar para o container da nossa aplicao.

A tag root dos arquivos de configurao do Spring a tag <beans> que define os namespaces e os DTDs necessrios. De comeo deixe o arquivo assim: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> </beans>

Essa a estrutura bsica de um arquivo de configurao (no se assuste com o tamanho dessa tag, vc no precisa decorar essas coisas). J que nossas classes esto prontas, vamos para o nosso primeiro competidor: Jos. O Jos vai cantarAtirei o Pau no Gato. Para declar-lo e dar a msica pra ele vai ficar assim: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="atireiopau" class="injecaodependencia.AtireiOPauNoGato" /> <bean id="jose" class="injecaodependencia.Cantor"> <property name="musica" ref="atireiopau" /> </bean> </beans>

Aqui que o Spring comea a trabalhar, cada tag no arquivo de configurao representa um objeto que o container ir gerenciar. No nosso exemplo, temos o bean atireiopau que um objeto da classe AtireiOPauNoGato e o bean jose que eh um Cantor e vai cantar a msica referenciada pelo bean atireiopau. Em termos de cdigo, seria como se o container fizesse o seguinte: injecaodependencia.AtireiOPauNoGato atireiopau = new injecaodependencia.AtireiOPauNoGato(); injecaodependencia.Cantor jose = new injecaodependencia.Cantor(); jose.setMusica(atireiopau);

Essa a mgica da Injeo de Dependncia, o Jos teve a msica injetada nele, se a gente quiser que ele cante outra msica no precisamos reescrever a classe Cantor, apenas injetar uma msica diferente nele. Isso torna a aplicao muito mais desacoplada, muito mais fcil de testar e de reusar os mdulos!!! Mas e para usar isso agora? Como que a gente pe isso pra funcionar? Eu quero ver o Jos cantar!!!! hehehe Vamos l ento, vamos ao cdigo da classe principal do nosso exemplo: public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/idolos.xml");

Competidor competidor = (Competidor) ctx.getBean("jose"); competidor.apresentar(); } }

A interface ApplicationContext justamente o container (um dos existentes) do Spring Framework. Existe tambm a BeanFactory mas essa bem mais simples e eu no irei coment-la. O que acontece nesse cdigo ento o seguinte: criado o container passando o arquivo de configurao que ele ir utilizar, depois recuperado o bean jose do container (nesse momento o container instancia o bean e todas as suas dependncias) e por fim, ns pedimos pro Jos se apresentar. Voc dever ver ele cantando incrivelmente bem o clssico Atirei o Pau no Gato. Porm o prximo competidor promete! Ele ir cantar E tocar Ciranda Cirandinha com uma gaita!! Essa eu quero ver!! Vamos s classes necessrias para o prximo competidor: public class CirandaCirandinha implements Musica { private static String[] letra = { "Ciranda , cirandinha,", "Vamos todos cirandar,", "Vamos dar a meia volta,", "Volta e meia vamos dar", "", "O anel que tu me destes,", "Era vidro", "E se quebrou.", "O amor que tu me tinhas", "Era pouco e se acabou.", "", "Ciranda , cirandinha,", "Vamos todos cirandar,", "Vamos dar a meia volta,", "Volta e meia vamos dar"}; public void cantar() { for (int i = 0; i < letra.length; i++) { System.out.println(letra[i]); } }

public interface Instrumento { public void tocar(); } public class Gaita implements Instrumento { public void tocar() { System.out.println("FUU FUU FII FII"); } } public class CantorTocador extends Cantor { private Instrumento instrumento; public CantorTocador() { super(); } public void setInstrumento(Instrumento instrumento) { this.instrumento = instrumento; } public void apresentar() { instrumento.tocar(); super.apresentar(); instrumento.tocar(); } }

Pronto, agora nosso prximo competidor est pronto para se apresentar. Sras e Srs dem as boas vindas para Carlos: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="atireiopau" class="injecaodependencia.AtireiOPauNoGato" /> <bean id="jose" class="injecaodependencia.Cantor"> <property name="musica" ref="atireiopau" /> </bean> <bean id="ciranda" class="injecaodependencia.CirandaCirandinha" /> <bean id="gaita" class="injecaodependencia.Gaita" /> <bean id="carlos" class="injecaodependencia.CantorTocador"> <property name="musica" ref="ciranda" /> <property name="instrumento" ref="gaita" /> </bean> </beans>

Agora basta chamar o Carlos para se apresentar ao invs do Jos: public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/idolos.xml"); Competidor competidor = (Competidor) ctx.getBean("carlos"); competidor.apresentar(); } }

E se a gente quisesse que o Carlos tocasse piano cantando Atirei o Pau no Gato? Simples: public class Piano implements Instrumento { public void tocar() { System.out.println("PLIN PLIN PLIN"); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="atireiopau" class="injecaodependencia.AtireiOPauNoGato" /> <bean id="jose" class="injecaodependencia.Cantor"> <property name="musica" ref="atireiopau" /> </bean> <bean id="ciranda" class="injecaodependencia.CirandaCirandinha" /> <bean id="gaita" class="injecaodependencia.Gaita" /> <bean id="piano" class="injecaodependencia.Piano" /> <bean id="carlos" class="injecaodependencia.CantorTocador"> <property name="musica" ref="atireiopau" /> <property name="instrumento" ref="piano" /> </bean> </beans>

Basta injetar os beans desejados nas dependncias e boa! Tudo segue seu fluxo natural. Esta foi uma pequena (eu diria mnima) introduo Injeo de Dependncias no Spring Framework. O container ApplicationContext possui muuuuuito mais funes para gerenciar os seus beans, porm isso iria extender demais este assunto. Acho que se voc leu o post at aqui, vc conseguiu pegar o que eu quis passar: programar utilizando interfaces torna o seu cdigo muito mais limpo, fcil de entender, fcil de dar manuteno, fcil de reutilizar, fcil de extender, ou seja, melhora tudo!! Adicionando isso com a tcnica de Injeo de Dependncia torna a aplicao altamente desacoplada em termos de componentes (voc pode utilizar a classe Cantor em qualquer outra aplicao, s precisa passar uma classe que implemente a interface Musica pra ele e tudo vai funcionar perfeitamente). Os cdigos fontes utilizados neste tutorial esto aqui.

You might also like