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

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

Modularização de interesses ortogonais

Apresentações semelhantes


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

33 Dúvidas?


Carregar ppt "Modularização de interesses ortogonais"

Apresentações semelhantes


Anúncios Google