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!!

AnnotationsConfiguration Deprecated Hibernate 3.6

opa! Pessoal,

O post de hoje é bem pequeno, porém importante para quem for usar o Hibernate 3.6/superior. Venho utilizando o versao 3.2 por um bom tempo devido aos projetos que tenho atuado  está usando a 3.2. Daí surgiu um novo projeto e então na definição optei em usar a versão mais recente e estável o Hibernate 3.6.x confesso que não tenho acompanhado os release de cada versão e ao usar descubro mudanças à nível de code, principalmente da forma que faziamos na 3.2  uma delas foi com o new AnnotationConfiguration() e hoje vamos ver o que mudou.

Lets go…

Saiba mais: www.hibernate.org

Starting

Aqui no blog há vários posts usando Hibernate com AnnotationsConfiguration. Mas, para quem estiver com a versão mais recente do Hibernate terá que mudar apenas uma linha de código, pois a classe AnnotationsConfiguration que era filha de Configuration foi deprecated pelo team do Hiberante, então nada de informar que vai usar annotations usando essa classe, agora é com a classe pai Configuration.

Os Impactos

Não é um impacto muito grande, uma vez que vai precisa apenas alterar uma linha do seu código, caso você venha da versão 3.2 para 3.6. Porém, o esquecimento de alterar o código e somente adicionar as os novos .jars , farão seu build quebrar :).

Na Pratica

A seguir mostro a forma na versão 3.2 e 3.6 que você vai alterar no seu DAO.

Versão 3.2

public class DAO {

private static final SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

//mais code

}

Versão 3.6

public class DAO {

private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

//mais code

}

Espero que tenham gostado da dica, mas é vivendo e aprendendo, principalmente quando não acompanhamos as releases, hehe.

Vou ficando por aqui, see you next post.

Abracos,

JPA com Jboss

womanjava

olá pessoal, nesse post vou mostrar como criar um JPA Project e seus beneficios através da ferramenta Jboss Tools. Em um dos meus posts eu expliquei como instalar e configurar o Jboss tools no eclipse.

Montar uma estrutura JPA na “mão-grande” é um pouco cansativo e não tão produtivo quando se tem auxilio de uma ferramenta como Jboss tools. Nao estou dizendo que a ferramenta vai programar por você, ela apenas vai fazer a parte operacional não relacionada a programação, e você como bom desenvolvedor vai estar focado na parte lógica do negócio.

Lets go…

Outros posts:

  1. Abra o Eclipse e o seu workspace (uma vez que tenha instalado o plugin Jboss tools)

  2. Clique em New ==> Project

  3. Na lista que aparece vá até o diretório JPA.

  4. Escolha JPA Project, conforme a imagem abaixo:

    japproject

  5. Clique em next e na próxima pagina vamos dar o nome ao projeto e configurar o servidor. Aqui estamos usando o TomCat. Veja na imagem a seguir:

    namejpa

  6. Clique em next duas vezes. Até encontrar a tela a seguir. Agora precisamos configurar JPA e a plataforma. Depois clique em Finish

    jpaeclipse

  7. Pronto! Agora vc ja tem um projeto apto a usar JPA com os .jars adicionados estrutura ja montada pelo Jboss tools. Confira na imagem abaixo:

    jpaestrutura

Se você não conhecia o Jboss tools fica ai um pouquinho como a ferramenta pode ajudar no dia-dia.. 😉

Abraços! See you later…


Follow me: http://twitter.com/camilolope

Hibernate Annotations + JSF + MySql

stressprogrammer

Ola Pessoal!! Dando continuidade ao post anterior, resolvi dar um update na nossa NewsLetter. No post anterior desenvolvemos usando apenas Hibernate + JSF e tendo o MySql como BD. Hoje veremos um recurso que está “bombando” no mercado sao os Annotations. Realmente vieram para ficar e usar Hibernate puro é bem mais trabalhoso sem falar que ficar criando arquivos .xml para mapeamento com o BD nao é algo tão confortável assim. Então veremos o que annotations pode fazer por nos desenvolvedores. Veremos o básico da tecnologia Annotations nesse post.

Ahh, um ponto importante não vou repetir todo o conteudo do post anterior tais como :criaçao das paginas JSF, do Bean, dos arquivos Hibernate etc. Irei apresentar apenas os arquivos que devem sofrer alterações e o que deve ser acrescentado na aplicação para que a nova tecnologia entre em cena. Se vc perdeu o post anterior, ele está logo abaixo:

Post Recomendado
JSF + Hibernate + MySql no Eclipse

O que é Java Annotations? (abaixo a técnica de reutilização da informação 😉 )
An annotation, in the Java computer programming language, is a special form of syntactic metadata that can be added to Java source code.[1] Classes, methods, variables, parameters and packages may be annotated. Unlike Javadoc tags, Java annotations can be reflective in that they can be embedded in class files generated by the compiler and may be retained by the Java VM to be made retrievable at run-time.

Fonte: http://en.wikipedia.org/wiki/Java_annotation

Downloadhttps://www.hibernate.org/6.html
Antes de começar você precisa ir no site hibernate.org e fazer o download do package Hibernate Annotations a versão que estamos usando aqui é 3.4.0 GA .
Em seguida descompacte o arquivo e copie os arquivos .jars de lib e cole no lib do seu projeto. Na verdade precisamos apenas de dois arquivos .jars: hibernate-annotations.jar e o ejb3-persistence.jar

Desenvolvimento
1. Primeiro passo agora é alterar o Bean. Então abra o seu arquivo bean, que no nosso caso é NewsLetter.java no package br.com.bean. E altere o arquivo conforme o code a seguir:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table (name="newsletter")
public class NewsLetter {

@Column (name="nome")
String nome;
@Column(name="email")
String email;
@Id
@GeneratedValue
int id;
public String getNome() {
return nome;}
public void setNome(String nome) {
this.nome = nome;	}
public String getEmail() {
return email;}
public void setEmail(String email) {
this.email = email;}
public int getId() {
return id;	}
public void setId(int id) {
this.id = id;	}}

Explicando as anotacoes:
@Entity = é uma entidade que representa uma class bean;
@Table = mapeia com o nome da tabela. Aqui eu coloquei o table para explicar, mas poderia omitir levando em conta que eu teria uma table no meu BD com o mesmo nome da minha class Bean. Ou seja, se nao especificar qual será a tabela do BD, será considerada o nome do Bean. Tenha atenção se você tem tabelas com nomes diferentes em relação ao seu bean;
@Id = tem relação com a chave primaria da sua tabela;
@Column = mapeia com as colunas da sua tabela, segue a mesma regra de table, quando ter colunas com nomes diferentes este campo eh obrigatório, caso contrario non-required ;
2.Precisamos fazer umas mudanças na classe de conexao, entao abra o arquivo ConexaoFactory.java e altere conforme abaixo

package br.com.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class ConexaoFactory {
private static 	final SessionFactory sessionfactory;
private static final ThreadLocal threadlocal = new ThreadLocal();
static{
try{
//agora é Annotations que comanda
sessionfactory = new AnnotationConfiguration()
.configure("hibernate.cfg.xml").buildSessionFactory();
}catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}}
public static Session getInstance(){
Session session = (Session)threadlocal.get();
session = sessionfactory.openSession();
threadlocal.set(session);
return session;
}}

Nessa classe usamos a classe AnnotationConfiguration()para que ele aponte para as anotacoes no arquivo NewsLetter.java atualizado anteriormente com os annotations.

3.Precisamos apenas fazer uma pequena alteração no arquivo de configuração do hibernate que criamos no post anterior o arquivo hibernate.cfg.xml. Lembra que ele tinha uma referencia para o arquivo visitante.hbm.xml que este arquivo tinha como objetivo fazer o mapeamento com o BD? Pois é, ele será descartado a partir de agora, se quiser pode ate deletar do projeto. E deixe o seu arquivo hibernate.cfg.xml conforme o code abaixo:


org.gjt.mm.mysql.Driver
jdbc:mysql://localhost/livraria
camilo
bahia
  
org.hibernate.dialect.MySQLDialect

Apenas removemos as tags que apontavam para o arquivo de mapeamento e inserimos a classe bean que possui um annotation mapeamendo o nosso BD.
4.Salve todas as alteracoes, seu projeto deve estar conforme a imagem a seguir:

Note que não temos mais o arquivo visitantes.hbm.xml, como tinhamos no ultimo post.
Agora pode testar o resultado é o mesmo, ou seja, ele deve cadastrar tranquilamente o usuário, porem agora é com annotations e nao mais com hibernate puro.

Vou ficando por aqui e espero que tenham gostado do post. E se vc está começando a estudar o framework aqui pode ser seu ponto de partida ;).
abracos e até o próximo post…