Modularização de interesses ortogonais AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos
Sumário Introdução Aplicação Conclusã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
Introdução – O que é POA
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
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
Introdução - Terminologia Interesses Ortogonais
Introdução - Terminologia Interesses Ortogonais Interesses
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 : Join Points Pointcuts Advices,
Introdução - Construções Join Points (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
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) ;
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”
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)
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
Introdução - Construções Pointcuts genéricos call (* set*(..)) execution(public * Pessoa.*(..)) call(* dao..*(..)) call(PessoaDAO+.new(..))
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()
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(); }
Introdução - Modelagem
Aplicação - Controle Transacional Transação Controle Transacional
Aplicação - Controle Transacional Controle de Transação com Proxy
Aplicação - Controle Transacional Controle de Transação com AspectJ
Aplicação - Controle Transacional Controle de Transação com AspectJ pointcut transacao(): (@Transacional * *.*(..)); before() : transacao(){ JPAUtil.beginTransaction(); } after()returning : transacao() { JPAUtil.commitTransaction(); JPAUtil.closeEntityManager(); after() throwing : transacao() { JPAUtil.rollbackTransaction();
Aplicação – Buscas Genéricas Anotações Criadas @MetodoRecuperaLista @MetodoRecuperaUltimo @MetodoRecuperaPrimeiro @MetodoRecuperaConjunto @MetodoResultadoUnico
Aplicação – Buscas Genéricas Buscas genéricas com Proxy
Aplicação – Buscas Genéricas Buscas genéricas com AspectJ
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"); }
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()); }
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);
Aplicação – Padrão de Projeto … @Singleton public class PessoaService { public PessoaService(){ }
Aplicação – 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(..));
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);
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";
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
Dúvidas?