Série Spring: CRUD com Hibernate e Spring framework

olá Pessoal,

O post de hoje vamos fazer um CRUD usando Spring com Hibernate. Nós últimos posts vimos as coisas de forma separada para entendermos o funcionamento bem especifico. Vou considerar que leu nossos posts anteriores e aquilo que já foi explicado não estarei repetindo,para evitar que o post fique longo, apenas estarei ressaltando o que for importante e relevante para que você entenda.

Lets go..

O nosso Cenário

Será bem simples e funcional e o mais direto possível. O cenário é bem trivial uma livraria tem vários e um livro está para uma categoria, e em uma categoria pode ter vários livros.Dai vamos exercitar o relancionamento @OneToMany do hibernate e a integração do Hibernate com Spring. E para completar faremos a injeção de dependência usando Annotations.

 

Desenvolvimento

A seguir como ficará o nosso projeto

 springcrudbookproject

1. Crie um java project e os respectivos packages 

2. Adicione as bibliotecas do Spring Framework 3.x, Hibernate 3.x e MySql 5.x 

3. Crie a interface que terá o CRUD:

public interface BookStore {

                void saveOrUpdate(Book book);

                void delete(Book book);

                Book findById(Long id);

} 

4. Agora criaremos a classe que vai implementar a Interface:

@Repository

public class BookStoreDAO implements BookStore {               

                @Autowired

                private HibernateTemplate hibernateTemplate; 

                @Override

                public Book findById(Long id) {

                               return hibernateTemplate.get(Book.class, id);

                } 

                public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

                               this.hibernateTemplate = hibernateTemplate;

                } 

                public HibernateTemplate getHibernateTemplate() {

                               return hibernateTemplate;

                } 

                @Override

                public void saveOrUpdate(Book book) {

                               hibernateTemplate.saveOrUpdate(book);

                } 

                @Override

                public void delete(Book book) {

                               hibernateTemplate.delete(book);

                }}

 

 Até aqui nada de especial, exceto anotação @Autowired que colocamos para informar ao Spring que aquele atributo é dependecy injection que é controlado por ele. Quando criarmos o nosso arquivo de configuração do Spring vamos dizer para ele como olhar para as annotations. E anotação @Repository é para dizer ao Spring que essa classe é um DAO.

Agora vamos criar a classe CategoryDAO que vai persistir as categorias

@Repository

public class CategoryDAO {

                @Autowired

                private HibernateTemplate hibernateTemplate;               

                public void saveOrUpdate(Category category){

                               hibernateTemplate.saveOrUpdate(category);

                }}

Por enquanto essa classe não vai compilar, pq ainda não criamos a classe Category que criamos daqui a pouco, aguarde mais uns minutinhos. Bom,  até agora temos nossos DAOs prontos. Vamos criar nossos beans.

 

Book .java 

@Entity

public class Book implements Serializable{

                private static final long serialVersionUID = 888299914160143622L;               

                @Id

                @GeneratedValue

                private Long id;

                private Long isbn;

                private String title;

                private String author;

                @ManyToOne

                @JoinColumn(name=”category_id”)

                @Autowired

                private Category category;

//getters/setters omitidos

 

Category.java 

@Entity

public class Category implements Serializable { 

                private static final long serialVersionUID = 6469382724082923338L;

                @Id

                @GeneratedValue

                private Long id;

                private String categoryName;

                @OneToMany(mappedBy=”category”,targetEntity=Book.class,

fetch=FetchType.LAZY,cascade=CascadeType.ALL)

                @Autowired

                private List<Book> books = new ArrayList<Book>();

//getters/setters omitidos

 

Nada de especial aqui, apenas um relacionamento @OneToMany/@ManyToOne e o famoso @AutoWired que fará injeção de dependência.

 

Configurando o Spring 

1. Crie um arquivo xml e coloque no package conf,o meu chamei de springconfiguration.xml

 

O cabeçalho fica assim para dar suporte aos annotations: 

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd”>

 

Agora vamos criar os beans:

<!– beans  –>

 <bean  id=”category” class=”br.com.camilolopes.domain.classes.Category”/>

 <bean  id=”book”/>

 <bean  id=”bookstoredao” class=”br.com.camilolopes.dao.BookStoreDAO”/>

 <bean  id=”categorydao” class=”br.com.camilolopes.dao.CategoryDAO”/>

 

O dataSource, vou usar o MySql 

<!– DataSource –>

<bean id=”dataSource”>

                <property name=”driverClassName” value=”com.mysql.jdbc.Driver”/>

                <property name=”url” value=”jdbc:mysql://localhost/test”/>

                <property name=”username” value=”root”/>

                <property name=”password” value=”camilo2593″/>

</bean>

 <!– Using Annotations for mapping –>

 <bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

 <!– property for DataBase –>

                <property name=”dataSource” ref=”dataSource”/>

                <!– informing the annotated classes –>

                 <property name=”annotatedClasses”>

                <list>

                               <value>br.com.camilolopes.domain.classes.Book</value>

                               <value>br.com.camilolopes.domain.classes.Category</value>

                </list>

                </property>

                <!– Property of Hibernate –>

                <property name=”hibernateProperties”>

                               <props>

                               <prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>

                <prop key=”hibernate.show_sql”>true</prop>

                <prop key=”hibernate.hbm2ddl.auto”>update</prop>

                               </props>

                </property>

 </bean> 

 <!– using HibernateTemplate from Spring –>

 <bean  id=”hibernateTemplate” class=”org.springframework.orm.hibernate3.HibernateTemplate”>

                <property name=”sessionFactory” ref=”sessionFactory”/>

 </bean>

 

E definindo o uso de annotations para o Spring:

<context:annotation-config/>

E não esqueça de fechar o arquivo com:

</beans>

 

Agora criaremos uma classe com método main para realizar o CRUD: 

 

bdcrudspring

Esse é o nosso banco, com um cara já persistido: 

Crie a classe Main 

public class Main {

                public static void main(String[] args) {

//                           essa classe é o container

                               ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

                                                               “conf/springconfiguration.xml”);

                               BookStoreDAO bookStoreDAO = (BookStoreDAO) applicationContext.getBean(“bookstoredao”);

                               CategoryDAO categoryDAO = (CategoryDAO) applicationContext.getBean(“categorydao”);                              

//                           Book

                               Book book = new Book();

                               book.setAuthor(“Camilo Lopes”);

                               book.setIsbn(1235L);

                               book.setTitle(“Guia JEE c/ Frameworks”);                              

                               //Category

                               Category category = new Category();

                               category.getBooks().add(book);

                               category.setBooks(category.getBooks());

                               category.setCategoryName(“Development”);

                               book.setCategory(category );

//                           DAO

                                categoryDAO.saveOrUpdate(category);

                               bookStoreDAO.saveOrUpdate(book);                              

                               findBookById(bookStoreDAO, 1L);

                               deleteBook(bookStoreDAO,1L);

                }               

                private static void deleteBook(BookStoreDAO bookStoreDAO, long id) {

                               Book bookFound = bookStoreDAO.findById(id);

                               bookStoreDAO.delete(bookFound);

                               System.out.println(“Book deleted with sucess ” + bookFound.getTitle());                              

                }

                private static void findBookById(BookStoreDAO bookStoreDAO, Long id){

                               Book book = bookStoreDAO.findById(id);

                               System.out.println(“Title: “+ book.getTitle());

                               System.out.println(“Author: ” + book.getAuthor());

                }}

 

O código é bem simples somente para testarmos. Observe que salvamos um novo livro, em seguida buscamos o mesmo pelo Id e imprimos usando  o console do Java e depois deletamos o livro pelo Id.

Ao rodar teremos o resultado a seguir: 

resultcrudspring

Se formos no banco esperamos ter apenas o livro mais recente adicionado com o id igual 2 e o livro com o id = 1 deve ter sido deletado, com a imagem acima já vimos isso, pq temos o sql do hibernate habilitado, mas vamos ver na tabela do banco:

resultspringbd

 

resultcategoryspringbd

 

GitHub

Acesse o repositório no github com todos os projetos da série Spring:  https://github.com/camilolopes/workspacespring

Bom vou ficando por aqui, espero que tenham gostado do post.

abracos, see ya!!!

Série Spring: Hibernate com Spring Framework

olá pessoal,

No post de hoje vamos ver como integrar o Hibernate com Spring, faremos um exemplo muito simples que irá persistir um dado no banco. Vou considerar que você já tem o Hibernate 3.x e o Spring 3.x na sua máquina.

Lets go… 

Starting

Para o exemplo vou usar o Mysql, caso não tenha o driver de conexão vá no site do fabricante  e faça o download.

Desenvolvendo

Crie um java project, o meu será chamado de SpringHibernate.

springhibernateproject

Agora crie o bean:

@Entity

public class Spring {

@Id

@GeneratedValue

private Long id;

private String name;

//getters/setters omitidos

}

 

E agora vamos criar o DAO:

@Repository

public class SpringDAO {

/*

* esse é o cara que cuida de tudo, obter a transação, iniciar

* fechar e persistir

*/

private HibernateTemplate hibernateTemplate;

public HibernateTemplate getHibernateTemplate() {

return hibernateTemplate;

}

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

this.hibernateTemplate = hibernateTemplate;

}

public long save(Spring spring){

long cod =          (Long) hibernateTemplate.save(spring);

return cod;

}

}

 

Note: Observe que o método save retorna um valor do tipo long, que é o id do objeto inserido. Fiz isso somente para vermos qual foi o ID que o registro recebeu.

 

Feito isso precisamos passar umas informações para o Spring, tudo será feito no xml de configuração do Srping framework que criamos, fiz comentário in line para facilitar o entendimento:

<!– DataSource –>

<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>

<property name=”driverClassName” value=”com.mysql.jdbc.Driver”/>

<property name=”url” value=”jdbc:mysql://localhost/test”/>

<property name=”username” value=”root”/>

<property name=”password” value=”123456″/>

</bean>

<bean id=”hibernateTemplate” class=”org.springframework.orm.hibernate3.HibernateTemplate”>

<property name=”sessionFactory” ref=”sessionFactory”/>

</bean>

<!– usando annotation para mapeamento do bean –>

<bean id=”sessionFactory”    class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

<property name=”dataSource” ref=”dataSource” />

<property name=”annotatedClasses”>

<!– passando a bean anotado –>

<list>

<value>br.com.camilolopes.classes.Spring</value>

</list>

</property>

<!– configurações para o hibernate properties –>

<property name=”hibernateProperties”>

<props>

<prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>

<prop key=”hibernate.show_sql”>true</prop>

<prop key=”hibernate.hbm2ddl.auto”>update</prop>

</props>

</property>

</bean>

<!– classe dao que faz a persistencia e tem uma referencia para o hiberanteTemplate –>

<bean id=”springDAO”>

<property name=”hibernateTemplate” ref=”hibernateTemplate”/>

</bean>

 

Agora criamos uma classe main para testar:

public class Main {

public static void main(String[] args) {

//                           essa classe é o container

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

“conf/springconfiguration.xml”);

SpringDAO bean = (SpringDAO) applicationContext.getBean(“springDAO”);

Spring spring = new Spring();

spring.setName(“teste 1”);

System.out.println(bean.save(spring));

}}

springhibernateresultdb

É isso ai pessoal, vou ficando por aqui!! Há uma forma ainda melhor e mais fácil de trabalhar com o Hibernate no Spring que é a partir da versão 3.x do framework Spring quer veremos em um dos nossos posts a seguir. Mas, a forma via template é bastante usada em versões pré-Spring 3.

Os projetos

GitHub: http://github.com/camilolopes

see ya!!

Minha experiência profissional na Índia

IMG_2219

Olá Pessoal,

No post de hoje vou compartilhar com vocês como foi minha experiência de ter viajado para a Índia à trabalho. Como tudo na vida, há pontos positivos e negativos.

Lets  go…

 

A viagem

Bom, viajar para Índia não é nada rápido saindo de GRU e indo por Dubai. O tempo total da viagem incluindo a escala são de 21hrs. Então, se você viajar na classe econômica sabe que vai sofrer um pouco, apesar de que pela Emirantes a classe econômica é um pouco melhor da que estamos acostumados nas companhias aéreas brasileiras.

 

O objetivo

Na vida sempre precisamos ter um objetivo. Até mesmo quando viajamos à turismo é preciso ter um, assim conseguimos aproveitar melhor nosso tempo e saber onde queremos chegar ao final de uma missão. No caso da minha viagem, tínhamos um objetivo de projeto e nessas 2 semanas tínhamos a missão de cumprir o que foi dado. Como eu viajei à trabalho, a parte de turismo só é feita quando o tempo permite, pois para fazer um bom turismo é preciso de uma boa quantidade de horas, algo que não é tão fácil de conseguir em uma viagem desse tipo.

A Índia

Ao chegar na Índia (no meu caso fiquei em Bangalore), foi um choque cultural, apesar de que já tinha trabalhado com indianos e estava um pouco acostumado com o jeito deles, mas o detalhe é que trabalhei remotamente e agora o cenário era outro: eles estavam ali na minha frente e ai as coisas mudam. Se você vai para a Índia e espera encontrar algo organizado e estruturado, pode tirar isso da cabeça, é um país que está muito atrasado com relação ao Brasil. Não tem uma infraestrutura aceitável, a pobreza ainda é algo muito alto, o sistema de transporte público não é nem um dos mais ou menos. Até sistema de táxi é complicado, você anda nas ruas e vê apenas “tuk-tuk” uma espécie de “moto-taxi” indiana, mas taxi de verdade não é fácil identificar, exceto quando você sai de um shopping, etc. Ah, por falar em shopping, dizem que lá tem shopping para todos os lados, é verdade, mas se você juntar todos vai ser difícil chegar ao tamanho ou nível de um shopping normal aqui no Brasil. São pequenos e não há tanta coisa pra se fazer por lá, porém tá sempre lotado já que para os Indianos são TOP aqueles shoppings.

Outro ponto é que a cidade toda está em construção, pra qualquer lado que você vai na Índia tudo ainda sendo construído, nunca vi um lugar pra ter tanto prédio que foi derrubado e está fazendo outro.  E nesse meio tem os indianos carregando pedra na cabeça, principalmente as mulheres.

Os indianos são bastantes receptivos, gostam de conversar com estrangeiros, fazer amizade. Nos primeiros dias que cheguei, alguns colegas de trabalho passavam no hotel e convidavam para jantar e no almoço faziam questão de chamar a gente (eu e outro colega) para o almoço.

 

A comida

Aqui entra o sofrimento, se você não gosta de comida com pimenta e pior ainda, se não curte a comida indiana. Eu mesmo estou incluso nesse ponto. Foi um sofrimento achar local aceitável para comer. Se o Indiano fala que não tem pimenta é porque tem. Tudo por lá leva pimenta, até um simples sanduiche tem pimenta de matar. Tiveram dias que comi sem querer e fiquei com dor no estomago de tanta pimenta que tinha.  Como la a vaca é sagrada, esqueça de achar carne. Até o McDonalds e Subway são diferentes por lá. Mas da pra quebrar um galho.

Muito cuidado com o que você come, nada de querer comer algo na rua, o risco é muito alto de você pegar uma infecção ou algo pior. A higiene é muito duvidosa. Eu mesmo busquei fazer todas as minhas refeições em restaurantes de alto nível. Não pense que é caro, almoçar em um restaurante de alto nível lá, você sai pagando em média uns R$ 25 reais por refeição, e esses restaurantes são realmente chiques e há diversidade no cardápio, como culinária italiana, chinesa, japonesa, etc. Só não tem brasileira.

Eu me dei mal, comi um frango no restaurante e peguei uma infecção. Nunca tive algo daquele tipo, tive febre de 38-39 graus, dores no corpo, etc. Passei três dias indo/voltando para o centro médico de ambulância. Segundo o médico não é recomendado comer frango nessa época na Índia, agora não sei o motivo, porém consegui me recuperar tomando 1.5 mg de remédio por dia. É tenso a infecção por lá, então muito cuidado.

Na rua com os indianos o inglês deles não é tão bom, até porque muitos são pessoas que não tiveram a oportunidade de ir a escola ou de ter uma boa educação, mas quando você vai aos estabelecimentos que são mais ou menos ou tops daí você não tem problema com isso.

Os custos na Índia

Nunca fui pra um lugar tão barato, a nossa moeda vale muito mais que a deles, então dá pra comprar muita coisa barata, alimentação principalmente. E eletrônicos é mais barato que aqui, por exemplo um Iphone 5 estava custando uns 1.700 reais já com as taxas. Tudo na Índia é barato, então se você for pra lá e vai ficar pelo menos duas semanas não troque mais de 200 dólares, é o suficiente pra você gastar o dinheiro como quiser, fazer compras, etc.

O que pude tirar da viagem

A viagem agregou bastante valor profissionalmente pra mim e pessoalmente também. Profissionalmente foi o relacionamento durante essas duas semanas com o cliente que é britânico e a convivência com os indianos, o uso do inglês para negócio, etc. E que não é fácil entender os indianos, pois a depender de que parte da índia ele é, fica mais difícil ou fácil de entender, porém com o tempo você acostuma e fica mais fácil, o problema todo está na pronuncia do indiano. Até porque o inglês não é o idioma materno, eles aprendem. Pelo que outro indiano me falou, eles estudam inglês como primeira língua depois vão para o Hindi. Bem, a experiência no final acho que foi única e é difícil de descrever.

Do lado pessoal, posso dizer que aprendi um pouco sobre a cultura deles, a vida do indiano que é sofrida, pois não é fácil conseguir um nível melhor de vida por lá. Pelo sistema do país, as chances de quem nasce pobre ter possibilidade de melhorar de vida não é tão fácil quanto aqui no país. Nós no Brasil não temos que reclamar de nada comparado à maneira que os indianos vivem. Mas também quando eles são ricos, é de ir até o topo.

O mercado de TI na índia é um dos setores mais fortes, todos querem entrar na área, pois é uma das possibilidades do indiano ter acesso a uma educação e formação melhor, porém, o salário por lá é bem baixo, fora do comum até. Para nós que chegamos de fora, achamos que é até uma exploração, já que muitas empresas negociam tudo em dólar e pagam em rúpia, mas pagando um “trocado” onde poderia pagar melhor. Por exemplo, um gerente de projeto. São poucos, mas muito poucos que  vão conseguir ganhar 200 mil rupias por mês, o que é equivalente a aproximadamente 3 mil reais. Um indiano que  ganha 200 mil rupias por mês é “barão” por lá.

Outro detalhe importante, a fila de quem tá querendo emprego na índia é grande com TI. Os indianos morrem de medo de perder o emprego, porque já tem um cara na porta esperando pra sentar no lugar, ao contrario do que acontece aqui no Brasil: quem tem que ficar no banquinho esperando profissionais são as empresas, na Índia elas não sofrem com isso.

 Conclusão

A conclusão que posso tirar é que, apesar dos altos e baixos que passei nessa viagem, até por ser um país bem diferente do nosso, foi uma experiência que valeu a pena. Lá é o lugar onde você desafia seu inglês, pois para conseguir produzir e ter dias produtivos é preciso entender os caras, e não é uma tarefa fácil sempre, é preciso ir se envolvendo, pegando o “pulo do gato” do idioma e ir adaptando ao contexto.  A seguir dois  vídeos que fiz nos dias que deu pra sair:

Vou ficando por aqui, e espero que tenham gostado do post.

Abraços, see ya!!!.

Série Spring:Rodando Unit Test com Spring Framework

Olá Pessoal,

Nesse post veremos como rodar nossos unit tests com o Spring framework, ou seja, aproveitar tudo de bom que tem o Spring e fazer nossos unit test funcionar normalmente. É bastante simples.

lets go…

Começando

Bem não vou entrar nos detalhes do que  é unit test, Spring, JUnit etc. Vamos direto ao ponto de maneira prática. Primeiro Crie um Java Project, o meu será SpringExampleUnitTest

note: claro que você precisa ter baixado o Spring framework core versão 3.x.

 

springexampleunittestproject

Note: adicione o arquivo commons-logging-1.1.1.jar  caso não tenha só baixar esse arquivo, basta digitar o nome no Google .

Desenvolvendo

Como bom baiano e pensando no carnaval de salvador vamos de chicletão. Temos uma interface que tem um método e uma classe que vai implementar:

 

package br.com.camilolopes;

public interface Competidor {

public void apresentar();

}

public class Chicletao implements Competidor {

                private Chicleteiro chicleteiroMusica;

                @Override

                public void apresentar() {

                               chicleteiroMusica.cantar();

                }

                public void setChicleteiroMusica(Chicleteiro chicleteiroMusica) {

                               this.chicleteiroMusica = chicleteiroMusica;

                }

}

 

public interface Musica {

void cantar();

}

public class Chicleteiro implements Musica {

                @Override

                public void cantar() {

                               System.out.println(“chicleteiro eu, chicleteira ela”);

                }

}

 

E no package conf, criamos um xml com as configurações do Spring:

<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-3.0.xsd”>

 <!– classe normal –>

 <bean id=”chicleteiro” />

<!– classe que implementa a interface –>

 <bean id=”bell”>

                <property name=”chicleteiroMusica” ref=”chicleteiro”/>

 </bean>

</beans>

 

Pronto. Agora vamos criar a classe de teste.Porém, vamos entender o que acontece com a nossa aplicação. Quando o método apresentar() é invocado, a classe vai se apresentar com a musica que deseja, no caso da classe Chicleteiro, vai cantar: “chicleteiro eu, chicleteira ela”.

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations={“classpath:conf/idolos.xml”})

public class ChicletaoTest {

                @Autowired

                private Chicleteiro chicleteiro;

               

                @Test

                public void testCantar() {

                Chicletao chicletao = new Chicletao();

                chicletao.setChicleteiroMusica(chicleteiro);

                try{

                               chicletao.apresentar();

                }catch (NullPointerException e) {

                               Assert.fail(“not expected result”);

                }

                }

 

Com Spring precisamos usar anotação @RunWith e informar qual framework vamos usar, no nosso caso usamos o JUNIT.Em seguida com anotações @ContextConfiguration estamos dizendo qual o xml que tem as configurações do Spring que usaremos para os testes. Que é o mesmo da aplicação. Em seguida fizemos um teste que apenas chama o método apresentar, e esperamos que nunca tenhamos um NullPointerException, mas para isso acontecer é apenas se a instância que chama o método for null, ou seja, não for instanciada. E com esse teste estamos validando duas coisas, uma que o Spring realmente está instanciando o atributo e que o resultado é o que esperamos. Veja:

springexampleunitestgreenresult

 

E assim temos nosso unit test integrado com o Spring. Simples não?

GitHub

Acesse o repositório no github com todos os projetos da série Spring:  https://github.com/camilolopes/workspacespring

Vou ficando por aqui!!

See ya! 

Série Spring:Injeção de dependência com Spring via Annotations

olá Pessoal,

No post de hoje vamos ver como usar annotations no Spring para fazer a injeção de depência. Nos posts anteriores vimos como fazer isso de forma declarativa, ou seja, usando o xml. Agora vamos para algo mais clear, pois sistemas grandes e muitas informações no xml pode ser um pensadelo durante a manuteção.

lets go…

Iniciando

Vamos criar um java project SpringAnnotations com a seguinte estrutura:

springannotationsproject

Criaremos uma interface e uma classe que implementa a mesma:

public interface MachineRegister {

                public void register();

}

public class Caixa1 implements MachineRegister {

                @Override

                public void register() {

                               System.out.println(“Caixa 1 registrado”);}

}

 

E agora teremos a classe que tem dependência:

 public class CentralMachine {

                private MachineRegister machineRegister;

 

                public CentralMachine(MachineRegister machineRegister) {

                               super();

                               this.machineRegister = machineRegister;

                }

                public void setMachineRegister(MachineRegister machineRegister) {

                               this.machineRegister = machineRegister;

                }

                public MachineRegister getMachineRegister() {

                               return machineRegister;

                }

                public void register() {

                               machineRegister.register();                      

                }}

 

Se fossemos declarar essa classe no xml seria assim:

 <bean  id=”caixa1″ class=”br.com.camilolopes.classes.Caixa1″/>

 <bean  id=”centralMachine” class=”br.com.camilolopes.classes.CentralMachine”>

 <constructor-arg name=”caixa1″ ref=”caixa1″/>

 </bean>

 

Mas, veremos como será via Annotations a seguir.

 

Usando Annotations

Vamos ver alguns conceitos importantes que você vai se deparar no código a seguir, mas resolvi dar um overview antes. 

No Spring a dependency injection via annotations nao vem configurado por default, é preciso informar isso ao .xml. Para fazer isso precisamos apenas adicionar a seguinte linha 

<context:annotation-config /> 

E atualizar o cabeçalho do beans para :

xmlns:context=”http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd”

Feito isso podemos remover as injenção de dependência.

O arquivo ficará assim:

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd“>

<!– Aqui estamos declarando o beans  –>

<bean  id=”caixa1″/>

 <bean  id=”centralMachine” class=”br.com.camilolopes.classes.CentralMachine”/>

 <context:annotation-config/>

</beans>

 

Agora vamos dizer ao Spring as dependências via annotations. Na classe CentralMachine adicione a seguinte anotação:

 public class CentralMachine {

                @Autowired

                private MachineRegister machineRegister;

                @Autowired

                public CentralMachine(MachineRegister machineRegister) {

                               super();

                               this.machineRegister = machineRegister;

                }

 

@AutoWired Annotation

Para injectar a dependencia usamos anotação @Autowired. Assim estamos dizendo que a classe X tem uma dependência de Y.

 Problema

Quando temos uma interface que é implementada por mais de uma classe como o Spring vai saber qual queremos?

Ele não vai saber, porque o Spring não tem bola de Cristal simplesmente  vai lançar uma exceção NoSuchBeanDefinitionException.

 Resolução

@Qualifier Annotations

Permite dizer para o Spring qual implementação ele deve considerar, passamos o id do bean.

public class CentralMachine {

                @Autowired

                @Qualifier(“caixa1”)

                private MachineRegister machineRegister;

 Agora vamos criar uma classe com o método main para testar:

 public class Main {

                public static void main(String[] args) {

//                           essa classe é o container

                ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

                                                               “conf/springconfiguration.xml”);

                 CentralMachine bean = (CentralMachine) applicationContext.getBean(“centralMachine”);

                               bean.register();

                }}

 

Resultado:

resultspringannotations

 

Pronto. Estamos usando annotations para fazer a injeção de depência no Spring. Simples não? Observe que diminuimos  algumas configuração que teriamos que no xml e passamos a fazer direito no código.Particularmente eu gosto muito de annotations.

Os projetos

GitHub: https://github.com/camilolopes/workspacespring

Vou ficando por aqui…

see ya!!