Modularização de interesses ortogonais - ppt carregar
Apresentação em tema: "Modularização de interesses ortogonais"— Transcrição da apresentação:
1 Modularização de interesses ortogonais
AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos
2 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
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 Introdução - Terminologia
Interesses Ortogonais Interesses
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 : Join Points Pointcuts Advices,
9 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
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 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 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) : * *.*(..)) && 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 ... 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 – 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