1 / 33

AspectJ

AspectJ. Modularização de interesses ortogonais. Heliomar Kann da Rocha Santos. Sumário. Introdução O que é POA História Terminologias Construções Modelagem Aplicação Controle Transacional Execução de Buscas genéricas em DAO Padrões de projeto com aspectj Auditoria e log de eventos

emelda
Download Presentation

AspectJ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Sumário • Introdução • O que é POA • História • Terminologias • Construções • Modelagem • Aplicação • Controle Transacional • Execução de Buscas genéricas em DAO • Padrões de projeto com aspectj • Auditoria e log de eventos • Outras aplicações • Tratamento de Exceções • Declaração de erros e warnings • Implementação default de interfaces • Conclusão • 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 • Xerox Palo Alto Research Center PARC • Atualmente é um projeto Eclipse • Modularização de interesses difíceis em POO

  6. Introdução - Terminologia • Interesses Ortogonais

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

  8. Introdução - Construções • Aspect • 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 • Composto por : • JoinPoints • Pointcuts • Advices,

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

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

  11. Introdução - Construções • Pointcut (Ponto de atuação) • Designadores de pointcut • call(Assinatura) – métodos e construtores • execution(Assinatura) – métodos e construtores • 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 • args(Padrão Tipo) – Argumentos descritos em “Padrão Tipo”

  12. Introdução - Construções • Pointcut (Ponto de atuação) • 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 • 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 • Ex: pointcut abc() : execution(* getPessoa*(..)) && this(PessoaService) || this(FuncionarioService)

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

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

  15. Introdução - Construções • Advices (Adendos) • Três tipos: • Before • Mais simples • After • After - Sempre depois do ponto de junção • 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 • Around (entorno de) • Mais poderoso • Pode escolher entre executar o método original • Execução do método através da construção proceed()

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

  17. Introdução - Modelagem

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

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

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

  21. Aplicação - Controle Transacional • Controle de Transação com AspectJ

  22. Aplicação – Buscas Genéricas • Anotações Criadas • @MetodoRecuperaLista • @MetodoRecuperaUltimo • @MetodoRecuperaPrimeiro • @MetodoRecuperaConjunto • @MetodoResultadoUnico

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

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

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

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

  27. Aplicação – Padrão de Projeto • Singleton • Anotação criada - @Singleton • ... private Map singletons = new Hashtable(); Object around() : call( (@Singleton+ *).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 … @Singleton public class PessoaService { … public PessoaService(){ … } … }

  29. 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 – Outras aplicações • Tratamento 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 – Outras aplicações • Declaraçã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 – Conclusão • Simplicidade • Evitar uso excessivo • Necessidade de manutenção • Competitividade • Trabalhos futuros • Plugin perfeitamente integrado com IDEs • Identificação de interesses ortogonais com IA

  33. Dúvidas?

More Related