Documente Academic
Documente Profesional
Documente Cultură
O Spring Framework uma soluo leve que permite a construo de aplicativos empresarias. Spring modular, isso permite o uso de apenas as partes necessrias, sem ter de implementar todos os mdulos do framework. Pode-se utilizar somente o mdulo IoC, com o Struts no topo, como tambm usar somente a integrao com o Hibernate ou a camada de abstrao JDBC. O Spring suporta o gerenciamento de transao declarativas, acesso remoto e lgica atravs do modelo RMI ou servios da Web, e vrias opes para a persistncia dos dados. Oferece uma completa estrutura MVC, e permite a integrao AOP transparente.
Verso 1.0
Apostila destinada ao curso com carga horria de 20 (vinte) horas
Sumrio
1. Spring Framework..................................................................................................................3 A viso geral do Spring Framework:......................................................................................3 Mdulos do Spring Framework..............................................................................................3 Exemplos de Aplicaes........................................................................................................5 2. Injeo de Dependncia ou IoC.............................................................................................6 3. Spring e Hibernate...............................................................................................................10 Introduo............................................................................................................................10 Amostra de Integrao.........................................................................................................10 1) Criao do banco de dados........................................................................................10 2) A classe Empregado....................................................................................................11 3) Criar o arquivo de mapeamento do Hibernate............................................................12 4) Criando o arquivo de configurao do Spring.............................................................13 5) Definir a classe EmpregadoDao..................................................................................14 6) Aplicativo cliente para teste.........................................................................................16 4. Spring e JPA.........................................................................................................................17 Spring como um Continer de JPA......................................................................................17 Definio das Entidades......................................................................................................18 Usando as Entidades JPA com o Spring.............................................................................18 Configurao da Camada de Persistncia..........................................................................20 Configurando o Contexto da Aplicao...............................................................................20 Configurando o Entity Manager Factory Bean.....................................................................21 Configurando o Vendor Adapter...........................................................................................22 Outras Configuraes..........................................................................................................22 Testes da Aplicao.............................................................................................................23 5. Gerenciamento de Transaes............................................................................................25 Propriedade das Transaes...............................................................................................25 Transaes Local versus Global..........................................................................................26 Programtica versus Declarativa.........................................................................................26 6. Spring Security.....................................................................................................................27 Segurana de uma aplicao..............................................................................................27 Protegendo a camada de servio........................................................................................28 7. Spring AOP...........................................................................................................................29 Conceitos.............................................................................................................................29 Hello World Spring AOP....................................................................................................30 Escrevendo nossa lgica de negcios............................................................................30
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
2 de 31
1. Spring Framework
A viso geral do Spring Framework:
Spring um padro formado em uma estrutura leve de aplicativos corporativos. Spring um framework aberto e criado para embarcar a complexidade do desenvolvimento de aplicaes corporativas. Uma das principais vantagens do Spring a sua arquitetura em camadas, permite que sejamos seletivos sobre quais de seus componentes que iremos utilizar para proporcionar um quadro coerente para o desenvolvimento de aplicaes J2EE. No entanto o Spring est limitado ao lado servidor do desenvolvimento. Qualquer aplicao Java pode se beneficiar em termos de simplicidade, testabilidade, e baixo acoplamento.
Cada um desses mdulos ou componentes consistem na estrutura do Spring e podem ser aplicados em conjunto com um ou mais mdulos ou componentes. Core Container: Proporciona a funcionalidade fundamental para o Spring. Neste, o componente primrio o mdulo BeanFactory, sendo uma implementao do padro de projeto Abstract Factory. O BeanFactory aplica a Inverso de Controle (IoC Inversion of Control ) padro para separar configurao de um aplicativo e especificao de dependncia do cdigo do
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
3 de 31
aplicativo real. Mdulo Contexto do Spring: um arquivo de configurao que fornece as informaes de contexto para o Spring. Inclui servios corporativos tais como e-mail, JNDI, EJB, internacionalizao, validao, programao de eventos do ciclo de vida de aplicaes. Tambm est includo o suporte para a integrao com templates como o Velocity. Mdulo Spring AOP: Permite que um componente de software implemente, atravs do padro de projeto decorator, um comportamento adicional, atravs do recurso de gerenciamento de configurao. Como resultado, possvel facilmente permitir AOP (Aspect Oriented Programming Programao Orientada a Aspecto) em qualquer objeto gerenciado pelo Spring. Este mdulo fornece servios de gerenciamento de transaes para os objetos em qualquer aplicao baseada em Spring. possvel incorporar o gerenciamento de transao declarativa em seus aplicativos, sem depender dos componentes EJB. Mdulo Spring DAO: Fornece uma camada de abstrao JDBC, que reduz a necessidade de fazer toda a codificao e anlise de banco de dados dos diferentes fornecedores e a transao dos cdigos de erro especficos. Alm disso, este mdulo fornece uma nova maneira de realizar em modo de programao, o gerenciamento das transaes declarativas, no apenas para as classes que implementam interfaces especiais, mas para qualquer dos objetos POJO (Plain Old Java Objects). Mdulo Spring ORM: Fornece a integrao com as ferramentas de mapeamento OR (Object Relational) como Hibernate, JDO e iBATIS. Suporta cada um dos frameworks ORM assim como JDBC. Mdulo Spring Web: Fornece os recursos bsicos para a integrao Web e constri neste mdulo um contexto de aplicao, fornecendo contextos de aplicativos baseados na Web. Como resultado, permite que o Spring suporte a integrao com o Struts. Este mdulo tambm facilita as tarefas de lidar com mltiplas partes para as requisies e parmetros de solicitao da ligao de objetos de domnio. Mdulo Spring framework MVC: Fornece uma arquitetura MVC (implementao do padro de projeto Model View Control) plugvel. Os usurios tm a opo de usar o framework Web ou continuar a usar o seu framework Web existente. O Spring separa as funes do controlador, o modelo de objeto, o despachante do objeto manipulador que torna mais fcil sua personalizao. O Spring no obriga a utilizao de codificao JSP para a camada de viso. O usurio possui a flexibilidade de utilizar JSP, modelos XSLT, Velocity, ou outros, para proporcionar a camada viso.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
4 de 31
Exemplos de Aplicaes
Exemplos de como um desenvolvedor de aplicativos, pode usar as vantagens da plataforma Spring: Um mtodo Java para executar uma transao de banco de dados sem ter que lidar com as APIs de transao. Um mtodo Java local de um procedimento remoto sem ter que lidar com as APIs remotas. Um mtodo Java local para uma operao de gesto sem ter que lidar com APIs JMX. Um mtodo Java local, com um manipulador de mensagens sem ter que lidar com JMS API.
s vezes as circunstncias no permitem mudar completamente um quadro. O Spring no fora sua utilizao total, no uma soluo tudo ou nada. Existem diversos front-ends como o WebWork, Struts, Tapestry, ou outros frameworks que podem ser integrados com base na camada intermediria, que permite utilizar os recursos de transao do Spring. Precisamos simplesmente conectar a lgica de negcio usando um ApplicationContext e usar um WebApplicationContext para integrar a camada Web.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
5 de 31
B. Interface: HelloService.java
package x25.com.tutorial.service; import x25.com.tutorial.domain.Name; public interface HelloService { public String sayHello(Name name); }
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
6 de 31
C. Interface: ByeService.java
package x25.com.tutorial.service; import x25.com.tutorial.domain.Name; public interface ByeService { public String sayBye(Name name); }
Aps a implementao dessas interfaces, o prximo detalhe considerar como integr-los de forma flexvel. Observe que todos os mtodos padro SET sero implementados por um Bean de configurao do Spring. Todas as dependncias (isto , as duas interfaces) podem ser injetadas pela estrutura do Spring utilizando estes beans. Observe que o mtodo wishMe() utiliza os servios para implementar o restante da aplicao. O arquivo hello.xml e o arquivo de configurao do Spring. D. Classe: HelloBean.java
package x25.com.tutorial.bean; import import import import java.util.Calendar; x25.com.tutorial.domain.Name; x25.com.tutorial.service.ByeService; x25.com.tutorial.service.HelloService;
public class HelloBean { public Name name; public HelloService helloService; public ByeService byeService; // GETs e SETs public void setHelloService(HelloService helloService) { this.helloService = helloService; } public void setByeService(ByeService byeService) { this.byeService = byeService; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } // Mtodos de Domnio public String wishMe(Name name) { Calendar calendar = Calendar.getInstance(); if (calendar.get(Calendar.HOUR_OF_DAY) < 12){ // Invoca o helloService return helloService.sayHello(name); } else { // Invoca o byeService
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
7 de 31
} } }
return byeService.sayBye(name);
Por fim, vamos implementar a classe TesteCliente que invoca estes servios. Temos vrias maneiras de carregar o arquivo de configurao mestre (hello.xml) para a classpath. Neste exemplo bsico usamos a ClassPathXmlApplicationContext. 4. Classe Exemplo:TesteCliente.java
package x25.com.tutorial.client; import org.springframework.context.support.ClassPathXmlApplicationContext; import x25.com.tutorial.bean.HelloBean; import x25.com.tutorial.domain.Name; public class TesteCliente { public static void main(String[] args) { try { System.out.println("Iniciando..."); // Lendo o hello.xml para a classpath ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] { "hello.xml" }); System.out.println("Lendo Classpath"); HelloBean helloBean = (HelloBean) appContext.getBean("helloBean"); Name name = new Name(); name.setFirstName("Fernando"); name.setLastName("Anselmo"); String str = helloBean.wishMe(name); System.out.println(str); System.out.println("Final.");
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
8 de 31
} }
Veja o cdigo destacado na listagem acima. A classe TesteCliente carrega os arquivos de configurao do Spring atravs de ClassPathXmlApplicationContext. Uma vez que os beans so carregados, possvel acess-los atravs do mtodo getBean(), conforme mostrado na Listagem. Na definio do HelloBean no arquivo hello.xml, que foi carregado pelo classpath, podemos acessar este bean usando o mtodo getBean().
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
9 de 31
3. Spring e Hibernate
Introduo
Hibernate um poderoso framework para a persistncia de dados em qualquer tipo de aplicao. Spring, por outro lado possui um mdulo de injeo de dependncia que suporta IoC, isso permite que integre perfeitamente com a maioria das tecnologias populares. Como pr-requisito devemos entender a necessidade da integrao, antes de realmente entrar na integrao dessas duas tecnologias. bem conhecido que o Hibernate uma poderosa ferramenta ORM, que se situa entre a aplicao e a base de dados. Permite que aplicativos acessem os registros de qualquer banco de dados de maneira independente de plataforma. No existe a necessidade da aplicao depender dos detalhes de baixo nvel, como o gerenciamento da conexo JDBC, lidando com as declaraes e conjuntos de resultados. Todos os detalhes necessrios para acessar uma determinada fonte de dados facilmente configurvel em arquivos XML. Outro detalhe que essa estrutura pode ser acoplada com qualquer aplicativo das plataformas Java Standard Edition e Java Enterprise Edition. Um dos problemas com o Hibernate que o aplicativo cliente acessa a base de dados usando este framework depende das APIs de configurao: SessionFactory e Session. Esses objetos continuam espalhados pelo cdigo de todo o aplicativo. Alm disso, o cdigo tem que manualmente manter e gerenciar esses objetos. No caso do Spring, esses objetos de negcios podem ser altamente configurveis com a ajuda do mdulo de IoC. Em palavras simples, o estado de um objeto pode ser exteriorizado do cdigo do aplicativo. Isso significa que possvel utilizar os objetos do Hibernate com os Beans do Spring e podemos desfrutar de todas as comodidades que o Spring proporciona.
Amostra de Integrao
Em vez de olhar para as APIs de integrao que esto disponveis no pacote do Spring, vamos compreender essas APIs atravs de cdigos de exemplo. As sees seguintes abordam as diferentes etapas envolvidas na integrao do Spring com o Hibernate.
Observar que o caractere ';' o terminador de instruo de cada comando. Uma vez que a base exemplo criada, devemos abri-la com o comando:
use exemplo;
Uma vez aberta significa que qualquer operao que realizemos, como a criao de tabelas,
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
10 de 31
afeta diretamente a base exemplo. Criamos uma tabela exemplo chamada "empregado" com quatro campos: matricula, nome, idade e salario. O comando a seguir cria a tabela "empregado" no banco de dados exemplo:
create table empregado( matricula char(10) not null, nome varchar(20), idade int(3), salario numeric(5,2), primary key (matricula) );
2) A classe Empregado
Criamos uma classe chamada Empregado para armazenar os dados que so obtidos a partir da tabela de empregados. O projeto de classe funciona de forma que os nomes das colunas de "empregado" da tabela sejam mapeados como os nomes das variveis na classe Java com o tipo de dados apropriado. A. Classe de Mapeamento: Empregado.java
package x25.com.tutorial.mapa; public class Empregado { private private private private String matricula; String nome; int idade; double salario;
public String getMatricula(){ return matricula; } public void setMatricula(String matricula){ this.matricula = matricula; } public String getNome(){ return nome; } public void setNome(String nome){ this.nome = nome; } public int getIdade(){ return idade; } public void setIdade(int idade){ this.idade = idade; } public double getSalario(){ return salario; }
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
11 de 31
public void setSalario(double salario){ this.salario = salario; } public String toString(){ return "Matrcula: " + matricula + ", Nome: " + nome + ", Idade: " + idade + ", Salrio: " + salario; }
Observe que sobrepomos o mtodo toString() para mostras os dados do objeto de empregado.
Observe que o arquivo de mapeamento um arquivo XML e seu nome por padro empregado.hbm.xml. Este arquivo hbm um arquivo de mapeamento reconhecido pelo mapeamento do Hibernate. Embora no seja necessrio seguir essa conveno, fcil descobrir que este um arquivo do tipo XML e que deve estar em conformidade com um DTD bem definido, com os mapeamentos padres do hibernate-mapping-3.0.dtd. O elemento de raiz para o arquivo de mapeamento o elemento hibernate-mapping que
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
12 de 31
pode definir um ou mais mapeamentos. Aps isso temos o elemento class que define um mapeamento entre o nome da tabela de banco de dados e a classe Java. O atributo ' name' deve apontar para um nome totalmente qualificado da classe Java enquanto o atributo 'column' deve apontar para a tabela de banco de dados. A prxima srie de elementos define o mapeamento dos nomes das coluna em relao as suas variveis homlogas de Java. O elemento ' id' correspondente a um identificador para uma linha usado como uma coluna de chave primria. O elemento property tem um atributo chamado 'name' que aponta para o nome da varivel Java, na sequncia qual o nome da coluna na tabela de banco de dados que mapeado.
A classe acima define uma fonte de dados do tipo BasicDataSource. Mais importante, define as propriedades de conexo diferentes que so necessrias para acessar o banco de dados. Para acessar o banco de dados MySql, precisamos de um driver padro JDBC do banco de dados. A primeira propriedade chamada driverClassName que aponta para o nome da classe do driver do banco de dados. A segunda propriedade url representa o caminho que necessrio para se conectar a base de dados. A terceira e quarta propriedades representam o nome e senha do usurio para estabelecer uma sesso com o banco de dados. O prximo Spring Bean representa uma implementao de um SessionFactoryBean. Quando utilizamos o Hibernate, um SessionFactoryBean responsvel por criar os objetos da sesso atravs do qual estaremos interagindo com a transao de dados. Porm, esse SessionFactoryBean ser configurado pelo Spring atravs da adio do seguinte cdigo:
<bean id="mySessionFactory"
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
13 de 31
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="meuDataSource"/> <property name="mappingResources"> <list> <value>./resources/empregado.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value>hibernate.dialect=org.hibernate.dialect.HSQLDialect</value> </property> </bean>
Para que o SessionFactoryBean seja corretamente configurado, devemos fornecer os seguintes dados obrigatrios. O primeiro a informao da fonte de dados que contm os detalhes para acessar o banco de dados. O prximo uma lista de objetos que contm as informaes de mapeamento entre as tabelas de banco de dados e os nomes de classes Java. Definimos um arquivo de mapeamento, no item 3 e referenciamos aqui com o elemento list. O Spring Bean importante para o modelo Hibernate, pois fornece um invlucro de baixo nvel de acesso a dados e para sua correta manipulao. Contm mtodos para inserir, eliminar, atualizar e localizar os registros no banco de dados. Para o modelo Hibernate ser configurado, um nico argumento no objeto SessionFactoryBean repassado, como na seguinte codificao:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"> <ref bean="meuSessionFactory"/> </property> </bean>
A definio de um Final Bean a classe DAO. Uma vez que esta classe foi definida a nvel da aplicao, pode conter qualquer nmero de mtodos para envolver o acesso aos dados do cliente. Como sabemos que a classe HibernateTemplate interage com o banco de dados, ideal referir um exemplo do modelo Hibernate para a classe DAO.
<bean id="empregadoDao" class="x25.com.tutorial.dao.EmpregadoDao"> <property name="hibernateTemplate"> <ref bean="hibernateTemplate"/> </property> </bean>
14 de 31
Classe: EmpregadoDao.java
package x25.com.tutorial.dao; import import import import import java.sql.SQLException; org.hibernate.HibernateException; org.hibernate.Session; org.springframework.orm.hibernate3.HibernateCallback; org.springframework.orm.hibernate3.HibernateTemplate;
public class EmpregadoDao { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate){ this.hibernateTemplate = hibernateTemplate; } public HibernateTemplate getHibernateTemplate(){ return hibernateTemplate; } public Empregado getEmpregado(final String id){ HibernateCallback callback = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException,SQLException { return session.load(Empregado.class, id); } }; return (Empregado)hibernateTemplate.execute(callback); } public void saveOrUpdate(final Empregado empregado){ HibernateCallback callback = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException,SQLException { session.saveOrUpdate(empregado); return null; } }; hibernateTemplate.execute(callback); }
Esta classe faz uso da API do Hibernate (particularmente ao objeto de sesso) para o acesso aos dados. Para instruir ao Spring acessar a API do Hibernate, colocamos a lgica de negcio que faz uso da API em um determinado mtodo bem definido e em uma interface conhecida pelo Spring. Isto acontece com a interface HibernateCallback e o mtodo doInHibernate() com uma instncia de uma sesso do Hibernate passada. Definimos dois mtodos: getEmpregado() e saveOrUpdate() na classe EmpregadoDao. Para fazer o uso das APIs do Hibernate, definimos todo o cdigo no mtodo HibernateCallback.doInHibernate() e informamos ao Spring para executar esse cdigo, passando como referncia a interface para o mtodo HibernateTemplate.execute().
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
15 de 31
public class SpringHibernateTeste { public static void main(String[] args) { Resource resource = new FileSystemResource( "./src/resources/spring-hibernate.xml"); BeanFactory factory = new XmlBeanFactory(resource); Empregado empregado = new Empregado(); empregado.setMatricula("123"); empregado.setNome("Fernando Anselmo"); empregado.setIdade(20); empregado.setSalario(15000.00d); EmpregadoDao empregadoDao = (EmpregadoDao)factory.getBean("empregadoDao"); empregadoDao.saveOrUpdate(empregado); Empregado empResultado = empregadoDao.getEmpregado("123"); System.out.println(empResultado); } }
No aplicativo cliente o controle vai como foi definido. Quando chamado o mtodo BeanFactory.getBean("empregadoDao") , o Spring encontra todas as referncias feitas na definio do bean do EmpregadoDao. Criando um objeto de Hibernate Template. Em seguida, feita uma tentativa para inicializar este objeto onde uma sesso do objeto Bean Factory referenciado. Durante a construo do objeto Session Bean da Factory, as informaes da fonte de dados resolvida juntamente com as tabelas do banco de dados e as classes Java. O principal objetivo da integrao do Spring ORM a sobreposio clara da aplicao, com qualquer acesso de dados e a tecnologia de transao, e para o baixo acoplamento dos objetos da aplicao. No existem mais dependncias de servios empresariais no acesso a dados ou estratgia de transao. Uma abordagem simples e consistente para os objetos de aplicao, mantendo-os como reutilizveis e livres de dependncias.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
16 de 31
4. Spring e JPA
O padro EJB 3.0 Java Persistence API (JPA) foi lanado em maio de 2006 como parte da plataforma Java Enterprise Edition 5 (Java EE). O que comeou como um sucessor mais fcil de usar para o to difamado padro Container-Managed Persistence (CMP) do componente EJB, logo evoluiu para uma incorporao das melhores prticas existentes no uso da mais proeminente e popular object-relational (O-R) persistence products. O resultado que os aplicativos possuem um padro moderno, leve para a persistncia de Java que pode-se usar em qualquer plataforma Java EE compatvel com servidor de aplicao 5, ou em aplicaes Java Standard Edition (SE). A estrutura do aplicativo Spring j existe h quatro anos, e tornou-se uma escolha popular, tanto em um contexto de servidor de aplicao e independente. Como a JPA, Spring uma tecnologia projetada para permitir que os aplicativos sejam construdos a partir de POJOs. O Spring executado dentro de qualquer contexto de tempo de execuo de um aplicativo que requer e suporta aplicaes, fornecendo uma ampla gama de servios. Alguns destes servios so abstraes mais existentes de nvel dos mdulos de servio, enquanto outros agregam valor ao recipiente Java EE. A camada de acesso a persistncia, particularmente popular entre a comunidade Spring, pois est muito bem integrado com qualquer tempo de execuo e a persistncia e facilitada por uma abordagem que permite trabalhar com objetos persistentes.
Um continer JPA host compatvel e deve ser implementado corretamente com o SPI a partir da perspectiva do recipiente. Ou seja, um provedor de persistncia compatvel com JPA implementa o SPI a partir da perspectiva do provedor. Se ambos os lados seguir essas regras, um recipiente compatvel deve ser capaz de executar qualquer implementao de provedor compatvel, persistncia e de mesma forma, um fornecedor deve ligar qualquer recipiente.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
17 de 31
Embora o Spring no um servidor de aplicao nem um continer Java EE 5, que faz aumentar, e s vezes implementar muitos dos servios utilizados em servidores de aplicao. Spring implementa uma poro de recipiente do SPI APP para que possa ser visto como um recipiente de APP. Como tal, fornece o suporte a classe de carregamento e tece o formato que os provedores JPA usam para ajudar a gerenciar as entidades em tempo de execuo. Os usurios se beneficiam de um ambiente no qual o continer em tempo de execuo e o provedor de persistncia JPA so totalmente integrados, no necessariamente em um contexto da plataforma Java EE 5. Isto proporciona muitas das vantagens da persistncia Java EE sem a necessidade de um continer.
Uma aplicao real teria muitas entidades, porm desejamos focar o uso da APP no Spring, e no nosso objetivo explicar como definir e mapear entidades JPA.
atualizar e excluir (Padro CRUD). Atua como um gerente de todas as entidades carregadas e uma fbrica para consultas que permitem s entidades serem carregadas. Um gestor de entidade anlogo a uma sesso TopLink do Oracle, sesso do Hibernate ou a uma interface equivalente fornecido pelos diversos frameworks de mapeamento OR. Por exemplo, para criar uma nova entidade persistente criamos um novo objeto Java do tipo de entidade e invocamos o mtodo persist() no gerenciador de entidade, e passamos a nova entidade como parmetro. Supondo que temos acesso a um gestor de entidade, o cdigo para criar um novo Livro simples.
Livro livro = new Livro(12769356, "Guerra e Paz", "Leo Tolstoy", Genero.FICCAO); entityManager.persist(livro);
Usando a APP, o mdulo gerenciador de entidade do Spring torna o trabalho muito simples. Na maioria dos casos uma questo de anotar um campo ou um mtodo de um Spring Bean com uma anotao @PersistenceContext1, que faz com que um gestor de entidade seja injetado. Em seguida, invocar o gestor de entidade no contexto de uma operao de recipiente. Utilizando o Spring, a transao pode ser iniciada e confirmada (commit) ou no (rollback) na entrada ou sada do mtodo. Para alcanar este objetivo necessrio ser realizado declarativamente a demarcao de uma transao automtica que deve acontecer. No Spring a maneira mais fcil de fazer isso anotar a classe bean ou mtodo com a anotao @Transactional, embora tambm seja possvel a utilizao de metadados XML que no nescessitam anotar o cdigo Java. O tipo de transao iniciada depende do tipo de gerenciador de transaes que est configurado no contexto da aplicao do Spring; o conhecimento de sua infraestrutura de transao subjacente completamente abstrada no cdigo Java. Um exemplo de um Spring Bean transacional e que utiliza um gestor de entidade para executar operaes de APP mostrado na classe abaixo: Classe: LivroInventarioSystem.java
package x25.com.tutorial; import javax.persistence.*; import org.springframework.transaction.annotation.Transactional; @Transactional public class LivroInventarioSystem { @PersistenceContext(unitName="BIS") EntityManager em; public void addLivro(int isbn, String titulo, String autor, Genero genero) { Livro livro = new Livro(isbn, titulo, autor, genero); em.persist(livro); } } 1 Observamos que @PersistenceContext uma anotao JPA padro e no especfico para o Spring.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
19 de 31
Esta classe bastante comum, exceto pela presena de duas anotaes adicionais, @Transactional e @PersistenceContext. A anotao @Transactional define que todos os mtodos da classe obtenham uma transao automtica, deste modo, uma transao ser fornecida sempre que invocado o mtodo addLivro(). Podemos ter facilmente o mtodo anotado diretamente para obter esse comportamento, mas a probabilidade de adicionar mais mtodos que tambm precisam de uma transao bastante elevada, ento uma classe a melhor forma de implement-lo. O atributo em ser injetado como uma instncia de EntityManager. O gestor de entidade injetado ser configurado de acordo com a unidade de persistncia chamado referido no atributo unitName da anotao @PersistenceContext. Unidades de persistncia nomeados so definidas e configuradas no arquivo de configurao persistence.xml da JPA e no contexto do aplicativo Spring como parte do Factory Bean do EntityManager.
O tipo de transao tambm depende do ambiente de implantao. Neste exemplo, estamos executando um simples mquina virtual Java (VM) e no usamos o acesso a um gerenciador de transaes JTA, por isso, definimos o tipo de transao como um RESOURCE_LOCAL.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
20 de 31
O tipo de componente criado por esta definio de bean o EntityManagerFactory, que o ponto de partida para utilizao da JPA. O nome da unidade de persistncia e a fonte de dados definida da maneira usual. Spring utiliza uma ou mais definies da plataforma Java 2 Standard Edition (J2SE) como fonte de dados e ponto de partida para a configurao de persistncia. Um nmero de tipos de fontes de dados esto disponveis, mas, neste caso, estamos usando um simples pool JDBC definida da seguinte forma:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/exemplo"/> <property name="userName" value="root"/> <property name="password" value="senha"/> </bean>
A propriedade loadTimeWeaver especifica a estratgia que o Spring utiliza para implementar um continer fornecedor de SPI e oferece a capacidade de weaving. Neste exemplo, usamos o recurso de instrumentao introduzida na plataforma Java SE 5 VM para especificar a classe InstrumentationLoadTimeWeaver. Se estamos executando um servidor Tomcat, seria este conjunto de ReflectiveLoadTimeWeaver utilizado como um carregador da classe Tomcat fornecida pelo Spring. Se estamos executando o Spring dentro do Oracle para contineres J2EE servidor (OC4J), devemos configur-lo para OC4JLoadTimeWeaver, que liga o suporte de carregamento da classe especial em OC4J.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
21 de 31
Adicionamos essa propriedade porque os provedores de persistncia diferentes tendem a fornecer um mecanismo para configurar essas propriedades, mas os mecanismos diferem de provedor para provedor. Ao definir os nomes de propriedade comum no Spring, as configuraes podem ser especificados independentemente da implementao do provedor que est sendo conectado. Isso facilita a mudana entre os prestadores de persistncia diferentes ao minimizar as mudanas de configurao algo que pode ajudar aos usurios a determinar quais provedores disponveis apresenta um melhor desempenho ou pode atender melhor as necessidades da aplicao. A seguinte definio do bean vendorAdapter com a propriedade jpaVendorAdapter. Define TopLink como o fornecedor e fornece os valores para as trs configuraes comuns de propriedade.
<bean id="vendorAdapter" class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter"> <property name="databasePlatform" value="${platform}"/> <property name="showSql" value="true"/> <property name="generateDdl" value="true"/> </bean>
A sequncia da databasePlatform entendido pelo provedor de persistncia por isso mesmo que o nome da propriedade comum, os valores podem ser de diferentes fornecedores. Temos atribudo uma plataforma varivel e definida em um aplicativo de contexto externo de propriedades. Implementaes como TopLink definem muito mais configuraes JPA que podem ser usados para configurar o provedor de maneiras que variam a especificao do tipo de cache para usar e declarar as classes personalizadas e os tipos de mapeamento. Estas propriedades adicionais so geralmente definidas como propriedades no arquivo persistence.xml.
Outras Configuraes
A prxima coisa que faremos declarar a classe LivroInventarioSystem como um Spring Bean. A definio de simples Bean apenas aponta ao Spring qual proxy e gerencia as instncias da classe e como sero criadas.
<bean class="x25.com.tutorial.LivroInventarioSystem"/>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
22 de 31
A seguir, vamos utilizar os recursos locais em nvel de transaes previstas pelo gerenciador de entidades JPA, assim podemos definir um bean gerenciador de transaes e vincul-lo classe JpaTransactionManager. Em seguida, referem-se a Entity Manager Factory Dependency para a nossa Entity Manager Factory Bean.
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean>
Este gerenciador de transaes projetado para suportar as conexes transacionais atravs de JPA, tambm permite o acesso direto a JDBC utilizando a biblioteca do mdulo de abstrao JDBC do Spring. Realizamos um pouco de limpeza para indicar ao Spring que deve agir em qualquer anotao @PersistenceContext e @Transactional encontrados na classe bean. Isto feito atravs da adio de dois elementos:
<bean class= "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> <tx:annotation-driven/>
O namespace tx e o esquema adicionado ao topo da aplicao do arquivo de contexto XML de modo que o espao possa ser reconhecido.
Testes da Aplicao
Spring projetado para facilitar as prticas geis de desenvolvimento especialmente para fazer testes mais fceis do que no tradicional desenvolvimento Java EE. O uso de injeo de dependncia e de programao POJO permite que testes unitrios sejam mais simples de serem realizados. Spring fornece uma poderosa integrao com as facilidades de testes que permite o cdigo acessar dados persistentes e ser testado sem a necessidade da implantao de um servidor de aplicativos ou qualquer outro continer. Esta funcionalidade empacotada no arquivo spring-mock.jar includo na distribuio do framework e permite os seguintes servios: Demarcao de transao automtica . Cada teste executado em sua prpria transao, que revertida por padro. Isso garante que cada teste pode ser executado em sua prpria sandbox sem produzir efeitos colaterais. Cache configuraes. Uma configurao como a mapeamentos OR carregado somente uma vez, assegurando que custos de inicializao no sero repetidos para cada teste. Injeo de dependncia de casos de teste . Os casos de teste podem ser injetados como componentes de aplicao, tornando-os mais fceis de desenvolver e inicializar.
Em conjunto, esses servios permitem que os testes podem ser escritos de forma rpida e facilmente executado em segundos. O exemplo a seguir mostra como facilmente podemos testar nosso sistema de Inventrio.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
23 de 31
Estendemos a classe de testes AbstractJpa, que uma subclasse de TestCase do JUnit e, ento, especificar um dispositivo de localizao de configurao. O suporte de ensaio ser automaticamente injetado por dependncia ao fornecer um mtodo no padro SET. Podemos fornecer qualquer nmero de mtodos no padro SET, sendo uma boa prtica testar um detalhe por vez. Devemos implementar o mtodo getConfigLocations() para retornar um array de configuraes do Spring que deseja carregar. A maioria dos dados de configurao idntico ao que foi utilizado em um cenrio implantado, minimizando a quantidade de trabalho adicional necessrio para implementar testes:
package x25.com.tutorial; import org.springframework.test.jpa.AbstractJpaTests; public class LivroInventarioSystemTest extends AbstractJpaTests { private LivroInventarioSystem livroInventarioSystem; public void setBookInventorySystem(LivroInventarioSystem livroInventarioSystem) { this.livroInventarioSystem = livroInventarioSystem; } protected String[] getConfigLocations() { return new String[] {"/my/path/my-spring-config.xml"}; }
Podemos adicionar qualquer nmero de mtodos neste cenrio. Estes podem acessar os dados usando o nosso objeto de acesso a dados (DAO) de fixao ou o JdbcTemplate e variveis da instncia sharedEntityManager herdados JpaTestCase como segue:
public void testAddLivro() { int ctOldLivro = jdbcTemplate.queryForInt("SELECT COUNT(0) FROM LIVRO"); livroInventarioSystem.addLivro( 12769356, "Guerra e Paz", "Leo Tolstoy", Genero.FICCAO); sharedEntityManager.flush(); int ctNewLivro = jdbcTemplate.queryForInt("SELECT COUNT(0) FROM LIVRO"); assertEquals("Deve ser adicionado nova linha na tabela LIVRO", ctOldLivro + 1, ctNewLivro); }
Usamos as consultas JDBC na mesma transao para verificar o comportamento correto do nosso DAO. Em primeiro lugar, consultamos o nmero de linhas na tabela LIVRO. Ento adicionamos um livro, tendo a certeza de lavar a unidade de trabalho atual, usando o mtodo EntityManager.flush(). Isso obriga ao provedor de persistncia para emitir o SQL necessrio para a atualizao. Agora podemos emitir outra consulta JDBC para verificar que adicionamos uma linha na base de dados. Sabemos que o nosso DAO no se limita a executar, sem exceo, mas tambm faz mudanas necessrias em nosso banco de dados. Essas alteraes sero revertidas quando o mtodo testAddLivro() for concluda, para que as alteraes no sejam persistentes ou afetem outros testes.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
24 de 31
5. Gerenciamento de Transaes
Gerenciamento de transaes fundamental em qualquer tipo de aplicaes que iro interagir com o banco de dados. A aplicao tem de assegurar que os dados so consistentes e da integridade dos dados mantida. H muitas estruturas de dados populares como JDBC, JPA, Hibernate, entre outros e o Spring Framework fornece uma maneira perfeita de integrao com essas estruturas.
Um sistema de banco de dados RDBMS deve garantir todas as propriedades para cada transao. A vista simplista de uma transao emitida para o banco de dados usada em uma instruo SQL, como se segue: Iniciar a transao comeando com o comando de transao. Realizar vrias operaes de manuteno de registros tais como, incluir, atualizar ou excluir usando instrues SQL. Se toda a operao bem sucedida em seguida, executar cometer outra forma de reverso de todas as operaes.
Spring oferece uma camada abstrata no topo das APIs de gesto subjacente transao diferente. O apoio do Spring de transao tem como objetivo fornecer uma alternativa para transaes EJB, adicionando capacidades de transao para POJOs. Spring suporta o gerenciamento de transaes tanto programtica quanto declarativa. EJB requer um servidor de aplicao, mas o gerenciamento de transaes Spring pode ser implementada sem a necessidade de servidor de aplicativos.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
25 de 31
Gerenciamento de transao declarativa prefervel a gesto programtica de transao, embora seja menos flexvel do que a gesto programtica de transao, que lhe permite controlar transaes atravs de seu cdigo. Mas como uma espcie de preocupao transversal, gerenciamento de transaes declarativo pode ser modulado com a abordagem AOP.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
26 de 31
6. Spring Security
Spring Security, uma autenticao flexvel e poderoso e uma estrutura de controle de acesso para garantir Primavera baseado em Java aplicao Web. Usamos o Spring Security para fornecer uma forma de autenticao de login simples para garantir o acesso URL em aplicao Web. uma forte autenticao e altamente personalizvel e de controle de acesso quadro. o padro de fato para garantir Primavera aplicaes baseadas sendo um dos projetos mais maduros do Spring e amplamente utilizado. Possui as seguintes caractersticas: Ativar a segurana Web e proteger os padres de URL diferentes em um aplicativo Usar um formulrio de login com base em autenticao contra um repositrio de memria de usurios de teste Usar senhas com hash para reduzir os riscos de comprometimento dos dados.
Vamos olhar com um pouco mais de profundidade no aplicativo de exemplo mais bsico que vem com o Spring Security. mais instrutivo para aumentar a segurana para um aplicativo da Web existente, por isso primeiro devemos remover a configurao de segurana existente na aplicao, e, em seguida, adicionar gradativamente as opes de configurao necessrias para satisfazer as nossas necessidades. Pode-se fazer mais do isto, basta modificar o arquivo WAR que vem com a distribuio do Spring Security, mas para obter melhores resultados, recomendamos a criao do cdigo de amostra em si mesmo.
Em geral, uma boa prtica negar o acesso por padro, ao invs de apenas garantir os recursos que precisamos. Com isso em mente, vamos mudar o bloco <http> e adicionar alguns controles de acesso Web
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
27 de 31
<http use-expressions="true"> <intercept-url pattern="/index.jsp" access="permitAll" /> <intercept-url pattern="/secure/**" access="isAuthenticated()" /> <intercept-url pattern="/secure/extreme/**" access="hasRole('supervisor')" /> <intercept-url pattern="/listAccounts.html" access="isAuthenticated()" /> <intercept-url pattern="/post.html" access="hasAnyRole('supervisor','caixa')" /> <intercept-url pattern="/**" access="denyAll" /> <form-login /> </http>
Isso permite o uso de anotaes de segurana em interfaces ao Spring. A principal interface para o aplicativo de exemplo chamado BankService e possui uma anotao necessria
public interface BankService { public Account readAccount(Long id); public Account[] findAccounts(); @PreAuthorize( "hasRole('supervisor') or " + "hasRole('teller') and (#account.balance + #amount >= -#account.overdraft)" ) public Account post(Account account, double amount); }
A anotao @PreAuthorize contm uma linguagem de expresso Spring que encapsula a lgica de nossa exigncia final. Ao executar o aplicativo, receberemos uma exceo se exceder o montante descoberto sem acesso supervisor. As expresses so uma ferramenta poderosa, mas devemos ser cuidadosos para construir a lgica excessivamente complicado.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
28 de 31
7. Spring AOP
Spring AOP um paradigma de nova programao, implementada em Java e no ocorre a necessidade de um processo de compilao especial. No necessrio controlar a hierarquia do carregador de classe, e portanto adequado para o uso em um continer Java Web ou um servidor de aplicao de Java EE. uma outra maneira de pensar sobre a estrutura do programa em termos de aspectos ou preocupao. Se compararmos AOP com OOP (Programao orientada a objetos), a OOP decompe a aplicao em hierarquia de objetos onde, como o AOP decompe a aplicao em Aspectos ou preocupao. Programao Orientada a Aspectos (AOP) complementa a Programao Orientada a Objetos (OOP), fornecendo outra maneira de pensar sobre a estrutura do programa. A unidade de chave de modularidade em OOP a classe, enquanto que em AOP a unidade de modularidade o aspecto. Aspectos permitem a modularidade das preocupaes, como o gerenciamento de transaes que atravessam vrios tipos e objetos. (Tais preocupaes so muitas vezes chamado de interesses transversais em literatura AOP). Um dos componentes chave da AOP. Enquanto que o mdulo IoC no depende AOP, ou seja, no necessrio usar AOP se voc no quiser, AOP complementa IoC para fornecer uma soluo de middleware.
Conceitos
Aspecto um subprograma que est associado com uma propriedade especfica de um programa. Como essa propriedade varia, o efeito "ondulaes" atravs de todo o programa. a funcionalidade ou caracterstica que atravessa sobre o objeto. AOP tambm aumenta a modularidade de um programa. Um aspecto disperso em virtude da funo que est sendo lido por um nmero de funes no relacionadas. Isso significa mudar de uma funo requer a modificao de todos os mdulos afetados. Como o cdigo tornando-o mais difcil de entender e manter. Aviso uma ao tomada pelo aspecto em um determinado ponto comum. um pedao de cdigo que executado durante a execuo do programa. Existem vrios tipos de conselho, dependendo da posio so chamados de um programa. Tipos de Aviso: Antes: Um aviso que executou antes de um ponto de juno (jointpoint). Um aviso do tipo antes no tem a capacidade de interromper o fluxo de um processo de execuo no ponto de articulao, a menos que ele lance uma exceo. Depois de Retornar: Um aviso que executou depois de um ponto de juno concludo normalmente. Por exemplo, um mtodo retorna sem lanar uma exceo. Em Torno: Responsvel pela escolha de se proceder a um ponto de juno ou um atalho para executar, retornando o seu valor prprio retorno ou lanar uma exceo. Executar o
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
29 de 31
comportamento personalizado antes e depois da invocao de mtodo por em torno de um ponto de juno. Depois de Lanar um Aviso: Executado quando um mtodo gera uma exceo. Depois de (finalmente) um aviso : Executado quando o programa sai do ponto de juno normalmente ou lana uma exceo. Weaving Processo de vinculao ao aspecto com outro aplicativo ou objeto para criar um tipo de conselho. Isso realizado no Spring em tempo de execuo. Ponto de Juno Um ponto utilizado no Spring AOP para representar a execuo de um mtodo. Aponta durante a execuo do programa ou mtodos ou excees. Inicia com mtodos, intercepta AOP e neste momento para fazer algumas outras coisas. isto , incio dos mtodos doThis(), doExtra(), test(), somethingElse(), entre outros. Objeto-alvo: objeto que est sendo assessorado por um ou mais aspectos. Tambm conhecido como o objeto aconselhou. O Spring AOP implementado usando proxy de tempo de execuo, este objeto um objeto no padro proxy. Proxy AOP: um objeto criado pelo framework AOP para implementar os contratos de aspecto (aconselhar execues mtodo e assim por diante). No Spring, um proxy AOP ser um proxy JDK dinmico ou um proxy CGLIB.
HelloWorldImpl.java
package x25.com.tutorial; public class HelloWorldImpl implements HelloInterface { @Override public void greet() { System.out.println("Tenha um Bom Dia !!!"); } @Override public void sayHello() { System.out.println("Hello World");
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
30 de 31
SimpleAdvice.java
package x25.com.tutorial; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class SimpleAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("Hello"); Object object = methodInvocation.proceed(); System.out.println("Done ..."); return object; }
Principal.java
package x25.com.tutorial; import org.springframework.aop.framework.ProxyFactory; public class MainClaz { public static void main(String[] args) { HelloWorldImpl helloWorldImpl = new HelloWorldImpl(); SimpleAdvice advice = new SimpleAdvice(); ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.addAdvice(advice); proxyFactory.setTarget(helloWorldImpl); HelloWorldImpl proxy = (HelloWorldImpl) proxyFactory.getProxy(); proxy.sayHello(); proxy.greet(); } }
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9
31 de 31