A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos.

Apresentações semelhantes


Apresentação em tema: "AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos."— Transcrição da apresentação:

1 AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

2 Sumário Introdução Introdução O que é POA O que é POA História História Terminologias Terminologias Construções Construções Modelagem Modelagem Aplicação Aplicação Controle Transacional Controle Transacional Execução de Buscas genéricas em DAO Execução de Buscas genéricas em DAO Padrões de projeto com aspectj Padrões de projeto com aspectj Auditoria e log de eventos Auditoria e log de eventos Outras aplicações Outras aplicações Tratamento de Exceções Tratamento de Exceções Declaração de erros e warnings Declaração de erros e warnings Implementação default de interfaces Implementação default de interfaces Conclusão Conclusão Conclusão e trabalhos futuros Conclusão e trabalhos futuros

3 Introdução – O que é POA

4 Introdução – Composição POA Linguagem de componentes: Java, C++.. Programas escritos em linguagem de componentes Linguagem de aspectos: AspectJ.. Programas escritos em linguagem de aspectos Combinador de aspectos: aspect weaver

5 Introdução - História Criada em 1997 Criada em 1997 Xerox Palo Alto Research Center PARC Xerox Palo Alto Research Center PARC Atualmente é um projeto Eclipse Atualmente é um projeto Eclipse Modularização de interesses difíceis em POO Modularização de interesses difíceis em POO

6 Introdução - Terminologia Interesses Ortogonais Interesses Ortogonais

7 Introdução - Terminologia Interesses Ortogonais Interesses Ortogonais Interesses

8 Introdução - Construções Aspect Aspect Abstração criada para conter o código de interesses ortogonais em um local separado Abstração criada para conter o código de interesses ortogonais em um local separado Semelhança com o class, porém não é instanciável Semelhança com o class, porém não é instanciável Composto por : Composto por : Join Points Join Points Pointcuts Pointcuts Advices, Advices,

9 Introdução - Construções Join Points (Ponto de Junção) Join Points (Ponto de Junção) Pontos bem definidos do código Pontos bem definidos do código Chamadas a métodos, construtores Chamadas a métodos, construtores Execuções de métodos Execuções de métodos Inicialização e pré-inicialização de Classes Inicialização e pré-inicialização de Classes Atribuições Atribuições

10 Introdução - Construções Pointcut (Ponto de atuação) Pointcut (Ponto de atuação) Delimita pontos de junção aos quais algum aspecto provavelmente será aplicado Delimita pontos de junção aos quais algum aspecto provavelmente será aplicado Estrutura Estrutura pointcut nomePointcut(ListaParametros) : ListaDesignadores pointcut nomePointcut(ListaParametros) : ListaDesignadores Ex.: Ex.: pointcut construtores() : call(* *.new(..)); pointcut construtores() : call(* *.new(..)); pointcut construtores2() : construtores() pointcut construtores2() : construtores() && !within(Pessoa) ; && !within(Pessoa) ;

11 Introdução - Construções Pointcut (Ponto de atuação) Pointcut (Ponto de atuação) Designadores de pointcut Designadores de pointcut call(Assinatura) – métodos e construtores call(Assinatura) – métodos e construtores execution(Assinatura) – métodos e construtores execution(Assinatura) – métodos e construtores within(Padrão Tipo) – Classe ou tipo em tempo de compilação within(Padrão Tipo) – Classe ou tipo em tempo de compilação withincode(Padrão Tipo) – Interno a um método em tempo de compilação withincode(Padrão Tipo) – Interno a um método em tempo de compilação args(Padrão Tipo) – Argumentos descritos em Padrão Tipo args(Padrão Tipo) – Argumentos descritos em Padrão Tipo

12 Introdução - Construções Pointcut (Ponto de atuação) Pointcut (Ponto de atuação) Designadores de pointcut Designadores de pointcut target(Padrão Tipo) – Objeto na qual se encontra a implementação do ponto de junção em tempo de execução target(Padrão Tipo) – Objeto na qual se encontra a implementação do ponto de junção em tempo de execução Ex: pointcut abc() : execution(* getPessoa*(..)) && target(PessoaService) Ex: pointcut abc() : execution(* getPessoa*(..)) && target(PessoaService) this(Padrão Tipo) - Objeto na qual se encontra o ponto de junção em tempo de execução this(Padrão Tipo) - Objeto na qual se encontra o ponto de junção em tempo de execução Ex: pointcut abc() : execution(* getPessoa*(..)) && this(PessoaService) || this(FuncionarioService) Ex: pointcut abc() : execution(* getPessoa*(..)) && this(PessoaService) || this(FuncionarioService)

13 Introdução - Construções Wildcards (Caracteres curingas) Wildcards (Caracteres curingas) * Qualquer seqüência de caracteres não contendo pontos Qualquer seqüência de caracteres não contendo pontos.... Qualquer seqüência de caracteres, inclusive contendo pontos Qualquer seqüência de caracteres, inclusive contendo pontos + Qualquer subclasse da classe em questão Qualquer subclasse da classe em questão

14 Introdução - Construções Pointcuts genéricos Pointcuts genéricos call (* set*(..)) call (* set*(..)) execution(public * Pessoa.*(..)) execution(public * Pessoa.*(..)) call(* dao..*(..)) call(* dao..*(..)) call(PessoaDAO+.new(..))

15 Introdução - Construções Advices (Adendos) Advices (Adendos) Três tipos: Três tipos: Before Before Mais simples Mais simples After After After - Sempre depois do ponto de junção After - Sempre depois do ponto de junção After Returning – Somente se o método não lançar exceções After Returning – Somente se o método não lançar exceções After Throwing – Somente se o método ter lançado uma exceção After Throwing – Somente se o método ter lançado uma exceção Around (entorno de) Around (entorno de) Mais poderoso Mais poderoso Pode escolher entre executar o método original Pode escolher entre executar o método original Execução do método através da construção proceed() Execução do método através da construção proceed()

16 Introdução - Construções Advices (Adendos) Advices (Adendos) Estrutura Estrutura tipoAdvice(ListaParametros) : ListaPointCut(){corpo} tipoAdvice(ListaParametros) : ListaPointCut(){corpo} Ex1: Ex1: before() : call( String *.toString()){ imprime(Antes de entrar no método toString); } before() : call( String *.toString()){ imprime(Antes de entrar no método toString); } Ex2: Ex2: pointcut metodosToString() : call(String *.toString()); pointcut metodosToString() : call(String *.toString()); String around() : metodosToString() { String around() : metodosToString() { return proceed().toUpperCase(); return proceed().toUpperCase(); }

17 Introdução - Modelagem

18 Aplicação - Controle Transacional Transação Transação Controle Transacional Controle Transacional

19 Aplicação - Controle Transacional Controle de Transação com Proxy Controle de Transação com Proxy

20 Aplicação - Controle Transacional Controle de Transação com AspectJ Controle de Transação com AspectJ

21 Aplicação - Controle Transacional Controle de Transação com AspectJ Controle de Transação com AspectJ pointcut transacao(): * *.*(..)); before() : transacao(){ JPAUtil.beginTransaction(); } after()returning : transacao() { JPAUtil.commitTransaction(); JPAUtil.closeEntityManager(); } after() throwing : transacao() { JPAUtil.rollbackTransaction(); }

22 Aplicação – Buscas Genéricas Anotações

23 Aplicação – Buscas Genéricas Buscas genéricas com ProxyBuscas genéricas com Proxy

24 Aplicação – Buscas Genéricas Buscas genéricas com AspectJBuscas genéricas com AspectJ

25 Aplicação – Buscas Genéricas Mudanças NecessáriasMudanças Necessárias DAOImpl deixa de ser AbstrataDAOImpl deixa de ser Abstrata public Pessoa getByLogin(String login) {public Pessoa getByLogin(String login) { throw new MetodoInterceptadoException( throw new MetodoInterceptadoException( "Esse método deve ser implementado via aspecto"); "Esse método deve ser implementado via aspecto");}

26 Aplicação – Buscas Genéricas pointcut buscaLista(JPADaoGenerico dao) : * *.*(..)) && target(dao); * *.*(..)) && target(dao); Object around(JPADaoGenerico dao): buscaLista(dao){ Object around(JPADaoGenerico dao): buscaLista(dao){ Signature sig = thisJoinPointStaticPart.getSignature(); Signature sig = thisJoinPointStaticPart.getSignature(); Method metodo = ((MethodSignature)sig).getMethod(); Method metodo = ((MethodSignature)sig).getMethod(); return dao.buscaLista( return dao.buscaLista( metodo, metodo, thisJoinPoint.getArgs(), thisJoinPoint.getArgs(), metodo.getAnnotation( metodo.getAnnotation( MetodoRecuperaLista.class) MetodoRecuperaLista.class).namedQuery());.namedQuery()); }

27 Aplicação – Padrão de Projeto Singleton Anotação criada private Map singletons = new Hashtable(); Object around() : call( *).new(..) ) { Class singleton = thisJoinPoint.getSignature().getDeclaringType(); if(singletons.get(singleton)==null){ singletons.put(singleton, proceed()); } return singletons.get(singleton); }

28 Aplicação – Padrão de Projeto public class PessoaService { … public PessoaService(){ … } … }

29 Aplicação – Aplicação – Auditoria e Log de Eventos Auditoria e Log de Eventos … pointcut services(): execution (public * br.uff.iduff2.service..*.*(..)) && !execution(*..service.controletransacao..*.*(..)) && !execution(List br.uff.iduff2.service..*.*(..)) &&!execution(* IdentificacaoService.autenticar(..)); pointcut autenticar(): execution(* IdentificacaoService.autenticar(..));

30 Aplicação – Aplicação – Outras aplicações Tratamento de ExceçõesTratamento de Exceções 1________________________________________________________ before(): handler(RuntimeException){ System.out.println("Exceção="+thisJoinPoint.getArgs()[0]); } 2________________________________________________________ declare soft : InterruptedException : withincode(* Principal.main(..)); 3________________________________________________________ after() throwing(Throwable t) throws InfraestruturaException: execution(* dao..*.*(..)){ throw new InfraestruturaException(t); }

31 Aplicação – Aplicação – Outras aplicações Declaração de erros e warningsDeclaração de erros e warnings Erros declare error: call( java.util.*.new(..) ): "Não é permitido instanciar objetos da biblioteca [java.util] "; Warnings declare warning: call( dao..*.new(..) ) && !within(service..*): "Essa construção deve ocorrer em um Server";

32 Aplicação – Aplicação – Conclusão SimplicidadeSimplicidade Evitar uso excessivoEvitar uso excessivo Necessidade de manutençãoNecessidade de manutenção CompetitividadeCompetitividade Trabalhos futuros Plugin perfeitamente integrado com IDEs Identificação de interesses ortogonais com IA

33 Dúvidas?


Carregar ppt "AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos."

Apresentações semelhantes


Anúncios Google