330 likes | 452 Views
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
E N D
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 • 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 – 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
Interesses Introdução - Terminologia • Interesses Ortogonais
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,
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
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(); }
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
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 • 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