Introduo a AOP Spring AOP Jobson Ronan jrjscin
Introdução a AOP + Spring. AOP Jobson Ronan {jrjs@cin. ufpe. br}
Motivação n n Atualmente OOP é o paradigma de desenvolvimento de software mais adequado Por que? ¡ ¡ ¡ n Emcapsulamento Herança Polimorfismo Porém, OOP não trata adequadamente de comportamentos que aparecem sobre muitos módulos
Um sistema como um conjunto de interesses n Um complexo sistema de software pode ser visto como uma implementação combinada de múltiplos interesses ¡ ¡ ¡ ¡ Lógica de negócios Performance Persistência Logging Debugging Autenticação Segurança Etc.
Um sistema como um conjunto de interesses n Dado um conjunto de requisitos, pode-se identificar uma série de interesses
Interesses atravessadores n Sistemas são criados em resposta a requisitos ¡ ¡ n n Core module-level requirements System-level requirements Muitos requisitos do sistema tendem a ser ortogonais (mutuamente dependentes) de outros e de requisitos de módulos. Requisitos do Sistema tendem a atravessar muitos modulos
Interesses atravessadores n Exemplo //. . . public class Account. Service { public void update. Account(update. Account acount) throws Exception { Security. Manager. require. User. Role(“admin”); } ///. . . Segurança Transaction. Manager. begin. Transaction(); try { //. . . código de negócio Transaction. Manager. commit(); log. info(“acount updated”); Transações } catch (Exception e) { Transaction. Manager. rollback(); log. warning(“exception throw”, e); throw e; } Logging
Problemas n n O espaço de requisitos é multidimensional, enquanto o de implementação é unidimensional Sintomas ¡ ¡ n Código misturado Código espalhado Afeta o desenvolvimento do software
Problemas n n n Pobre delineabilidade Diminuição da produtividade Menor reuso de código Baixa qualidade de código Evolução mais dificultada
Soluções n n Mix-in Classes Design Patterns ¡ n Visitor e Tamplate Method Específico de domínio ¡ EJBs
Separação de Interesses e AOP n AOP permite implementar individuais interesses de maneira fracamente acoplada e combinar essas implementações no sistema final. ¡ ¡ n Permite uma implementação modularizada de interesses atravessadores (crosscuting concerns) Essa unidade de modularização é chamada de Aspecto Estágios de desenvolvimento ¡ ¡ ¡ Decomposição aspectual Implementação do interesse Recomposição aspectual
Estágios de desenvolvimento
Benefícios n n Implementação modularizada de interesses atravessadores Sistemas fáceis de evoluir Decisões de modelagem atrasadas Maior reuso do código
Spring. AOP n n Uma das chaves do Spring e seu framework de AOP Apesar do container Io. C do Spring não depender de AOP, este completa o Spring oferecendo soluções interessantes ¡ ¡ Disponibilizar serviços declarativos coorporativos, como gerenciamento de transações e autenticação Possibilitar a implementação de aspectos customizados
Conceitos n Aspecto: ¡ n Joinpoint: ¡ n Ação tomada pelo framework AOP em algum Joinpoint Pointcut: ¡ n Ponto de execução de um programa. No Spring. AOP é sempre referente a uma invocação de método Advice: ¡ n Implementado no Spring como Advisors ou Interceptors Um conjunto de Joinpoints para os quais um advice deve ser disparado Objeto Alvo: ¡ Objeto contendo joinpoints. Também chamado de advised ou proxied
Conceitos n Introduction: ¡ n Proxy AOP: ¡ n Adicionar métodos e atributos em uma classe advised. Spring permite introduzir novas interfaces para objetos advised. Um objeto criado pelo framework de AOP, contendo um advice. Weaving: ¡ Aplicação de aspectos para criar objetos advised.
Tipos de Advices n n Around advice Before advice Throws advice After Returning advice
Tipos de Weaver n Estático ¡ Aspectos são tipicamente introduzidos ao byte code em tempo de compilação ou através de classloaders customizados em tempo de execução n n n Aspect. J (byte code) JBoss AOP, Aspect. Werkz (classloader) Dinâmico ¡ ¡ Cria proxies para todos os objetos interessados Leve perda de performance Fácil de configurar Spring
Em prática public interface IBusiness. Logic { public void foo(); } public class Business. Logic implements IBusiness. Logic { public void foo() { System. out. println( “Inside Business. Logic. foo()” ); } }
Em prática import org. springframework. context. Application. Context; import org. springframework. context. support. File. System. Xml. Application. Context; public class Main. Application { public static void main(String [] args) { // Read the configuration file Application. Context ctx = new File. System. Xml. Application. Context("springconfig. xml"); //Instantiate an object IBusiness. Logic test. Object = (IBusiness. Logic) ctx. get. Bean("businesslogicbean"); // Execute the public // method of the bean test. Object. foo(); } }
Entendendo n n n Uma vez que nossa Main. Application chama o método ctx. get. Bean() ela abre mão da instanciação e gerênciamento do Bean para o Spring Controlando a inicialização do nosso objeto, o Spring todas as tarefas de gerenciamentos requeridas por aplicações J 2 EE Isso, claro, antes que nosso objeto seja utilizado pela aplicação
Em prática n springconfig. xml <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http: //www. springframework. org/dtd/spring-beans. dtd"> <beans> <!-- Bean configuration --> <bean id="businesslogicbean" class="org. springframework. aop. framework. Proxy. Factory. Bean"> <property name="proxy. Interfaces"> <value>IBusiness. Logic</value> </property> <property name="target"> <ref local="bean. Target"/> </property> </bean> <!-- Bean Classes --> <bean id="bean. Target" class="Business. Logic"/> </beans>
Em prática n Diagrama de seqüência
Em prática n Implementando um Advice import java. lang. reflect. Method; import org. springframework. aop. Method. Before. Advice; public class Tracing. Before. Advice implements Method. Before. Advice { public void before(Method m, Object[] args, Object target) throws Throwable { System. out. println("Hello world! (by " + this. get. Class(). get. Name() + ")"); } }
Em prática n Para acoplar o Advice a determinados joinpoints de nossa aplicação prescisamos acrescentar algumas declarações no. . . springconfig. xml <!-- Advisor pointcut definition for before advice --> <bean id="the. Tracing. Before. Advisor" class="org. springframework. aop. support. Regexp. Method. Pointcut. Advisor"> <property name="advice"> <ref local="the. Tracing. Before. Advice"/> </property> <property name="pattern"> Aplicado por <value>. *</value> </property> expressões regulares! </bean> <!-- Advice classes --> <bean id="the. Tracing. Before. Advice" class="Tracing. Before. Advice"/>. . .
Em prática n springconfig. xml (cont. ) <!-- Bean configuration --> <bean id="businesslogicbean" class="org. springframework. aop. framework. Proxy. Factory. Bean"> <property name="proxy. Interfaces"> <value>IBusiness. Logic</value> </property> <property name="target"> <ref local="bean. Target"/> </property> <property name="interceptor. Names"> <list> <value>the. Tracing. Before. Advisor</value> </list> </property> </bean>
Em prática n springconfig. xml (cont. ) Chamada transparente ao Advice do aspecto
E ainda n Existem ainda outras formas de aplicar aspectos com o Spring ¡ Auto. Proxy: n n Bean. Name. Auto. Proxy. Creator Default. Advisor. Auto. Proxy. Creator
Conclusões n n n AOP com o Spring tem sido aplicado a vários projetos AOP melhora consideravelmente a qualidade de um sistema, aumentando a simplicidade do modelo AOP está pegando
Exercícios n n Rode o exemplo mostrado Implemente um log para nosso sistema com AOP
Introdução a AOP + Spring. AOP Jobson Ronan {jrjs@cin. ufpe. br}
- Slides: 30