Upload
internet
View
112
Download
6
Embed Size (px)
Citation preview
AspectJAspectJ
Modularização de interesses Modularização de interesses ortogonaisortogonais
Heliomar Kann da Rocha Santos
SumárioSumário IntroduçãoIntrodução
O que é POAO que é POA HistóriaHistória TerminologiasTerminologias ConstruçõesConstruções ModelagemModelagem
AplicaçãoAplicação Controle TransacionalControle Transacional Execução de Buscas genéricas em DAOExecução de Buscas genéricas em DAO Padrões de projeto com aspectjPadrões de projeto com aspectj Auditoria e log de eventosAuditoria e log de eventos Outras aplicaçõesOutras aplicações
Tratamento de ExceçõesTratamento de Exceções Declaração de erros e warningsDeclaração de erros e warnings Implementação default de interfacesImplementação default de interfaces
ConclusãoConclusão Conclusão e trabalhos futurosConclusão e trabalhos futuros
Introdução – O que é POAIntrodução – O que é POA
Introdução – Composição POAIntroduçã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óriaIntrodução - História
Criada em Criada em 19971997
Xerox Palo Alto Research Center PARCXerox Palo Alto Research Center PARC
Atualmente é um projeto EclipseAtualmente é um projeto Eclipse
Modularização de interesses difíceis em POOModularização de interesses difíceis em POO
Introdução - TerminologiaIntrodução - Terminologia
Interesses OrtogonaisInteresses Ortogonais
Introdução - TerminologiaIntrodução - Terminologia
Interesses OrtogonaisInteresses Ortogonais
Interesses
Introdução - ConstruçõesIntrodução - Construções
AspectAspect Abstração criada para conter o código de interesses Abstração criada para conter o código de interesses
ortogonais em um local separadoortogonais em um local separado Semelhança com o “class”, porém não é Semelhança com o “class”, porém não é
instanciávelinstanciável Composto por :Composto por :
Join PointsJoin Points PointcutsPointcuts Advices, Advices,
Introdução - ConstruçõesIntrodução - Construções
Join Points (Ponto de Junção)Join Points (Ponto de Junção) Pontos bem definidos do códigoPontos bem definidos do código
Chamadas a métodos, construtoresChamadas a métodos, construtores Execuções de métodosExecuções de métodos Inicialização e pré-inicialização de ClassesInicialização e pré-inicialização de Classes AtribuiçõesAtribuições
Introdução - ConstruçõesIntrodução - Construções
Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Delimita pontos de junção aos quais algum aspecto Delimita pontos de junção aos quais algum aspecto
provavelmente será aplicadoprovavelmente será aplicado
EstruturaEstrutura pointcut nomePointcut(ListaParametros) : ListaDesignadorespointcut nomePointcut(ListaParametros) : ListaDesignadores Ex.: Ex.:
pointcut construtores() : call(* *.new(..));pointcut construtores() : call(* *.new(..)); pointcut construtores2() : construtores()pointcut construtores2() : construtores()
&& !&& !within(Pessoa) ; within(Pessoa) ;
Introdução - ConstruçõesIntrodução - Construções
Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Designadores de pointcutDesignadores de pointcut
call(Assinatura) – métodos e construtorescall(Assinatura) – métodos e construtores
execution(Assinatura) – métodos e construtoresexecution(Assinatura) – métodos e construtores
within(Padrão Tipo) – Classe ou tipo em tempo de compilaçãowithin(Padrão Tipo) – Classe ou tipo em tempo de compilação
withincode(Padrão Tipo) – Interno a um método em tempo de withincode(Padrão Tipo) – Interno a um método em tempo de compilaçãocompilação
args(Padrão Tipo) – Argumentos descritos em “Padrão Tipo”args(Padrão Tipo) – Argumentos descritos em “Padrão Tipo”
Introdução - ConstruçõesIntrodução - Construções
Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Designadores de pointcutDesignadores de pointcut
target(Padrão Tipo) – Objeto na qual se encontra a target(Padrão Tipo) – Objeto na qual se encontra a implementação do ponto de junção em tempo de execuçãoimplementação do ponto de junção em tempo de execução
Ex: pointcut abc() : execution(* getPessoa*(..)) Ex: pointcut abc() : execution(* getPessoa*(..)) && target(PessoaService)&& target(PessoaService)
this(Padrão Tipo) - Objeto na qual se encontra o ponto de this(Padrão Tipo) - Objeto na qual se encontra o ponto de junção em tempo de execuçãojunção em tempo de execução
Ex: pointcut abc() : execution(* getPessoa*(..)) Ex: pointcut abc() : execution(* getPessoa*(..)) && this(PessoaService) || this(FuncionarioService)&& this(PessoaService) || this(FuncionarioService)
Introdução - ConstruçõesIntrodução - Construções
Wildcards (Caracteres curingas)Wildcards (Caracteres curingas) ““*” *”
Qualquer seqüência de caracteres não contendo pontosQualquer seqüência de caracteres não contendo pontos
““..” ..” Qualquer seqüência de caracteres, inclusive contendo pontosQualquer seqüência de caracteres, inclusive contendo pontos
““+” +” Qualquer subclasse da classe em questãoQualquer subclasse da classe em questão
Introdução - ConstruçõesIntrodução - Construções
Pointcuts genéricosPointcuts genéricos
callcall (* set*(..)) (* set*(..))
execution(execution(publicpublic * Pessoa.*(..) * Pessoa.*(..)))
call(* dao..*(..))call(* dao..*(..))
call(PessoaDAO+.new(..))
Introdução - ConstruçõesIntrodução - Construções
Advices (Adendos)Advices (Adendos) Três tipos:Três tipos:
BeforeBefore Mais simplesMais simples
AfterAfter After - Sempre depois do ponto de junçãoAfter - Sempre depois do ponto de junção After Returning – Somente se o método não lançar exceçõesAfter Returning – Somente se o método não lançar exceções After Throwing – Somente se o método ter lançado uma exceçãoAfter Throwing – Somente se o método ter lançado uma exceção
Around (entorno de)Around (entorno de) Mais poderosoMais poderoso Pode escolher entre executar o método originalPode escolher entre executar o método original Execução do método através da construção Execução do método através da construção proceedproceed()()
Introdução - ConstruçõesIntrodução - Construções
Advices (Adendos)Advices (Adendos) EstruturaEstrutura
tipoAdvice(ListaParametros) : ListaPointCut(){corpo}tipoAdvice(ListaParametros) : ListaPointCut(){corpo} Ex1: Ex1:
before() : call( String *.toString()){ before() : call( String *.toString()){ imprime(“Antes de entrar no método toString”); imprime(“Antes de entrar no método toString”); } }
Ex2:Ex2: pointcut metodosToString() : call(String *.toString());pointcut metodosToString() : call(String *.toString()); String around() : String around() : metodosToString() metodosToString() {{
return proceed().toUpperCase();return proceed().toUpperCase();
}}
Introdução - ModelagemIntrodução - Modelagem
Aplicação - Controle TransacionalAplicação - Controle Transacional
TransaçãoTransação
Controle TransacionalControle Transacional
Aplicação - Controle TransacionalAplicação - Controle Transacional
Controle de Transação com ProxyControle de Transação com Proxy
Aplicação - Controle TransacionalAplicação - Controle Transacional
Controle de Transação com AspectJControle de Transação com AspectJ
Aplicação - Controle TransacionalAplicação - Controle Transacional
Controle de Transação com AspectJControle 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éricasAplicação – Buscas Genéricas• Anotações CriadasAnotações Criadas
• @MetodoRecuperaLista@MetodoRecuperaLista
• @MetodoRecuperaUltimo
• @MetodoRecuperaPrimeiro
• @MetodoRecuperaConjunto
• @MetodoResultadoUnico
Aplicação – Buscas GenéricasAplicação – Buscas Genéricas
• Buscas genéricas com ProxyBuscas genéricas com Proxy
Aplicação – Buscas GenéricasAplicação – Buscas Genéricas
• Buscas genéricas com AspectJBuscas genéricas com AspectJ
Aplicação – Buscas GenéricasAplicação – Buscas Genéricas
• Mudanças NecessáriasMudanças Necessárias• DAOImpl deixa de ser AbstrataDAOImpl deixa de ser Abstrata
• public Pessoa getByLogin(String login) { public Pessoa getByLogin(String login) { throw new MetodoInterceptadoException(throw new MetodoInterceptadoException( "Esse método deve ser implementado via aspecto"); "Esse método deve ser implementado via aspecto"); }}
Aplicação – Buscas GenéricasAplicação – Buscas Genéricas
pointcut buscaLista(JPADaoGenerico dao) :pointcut buscaLista(JPADaoGenerico dao) :
call(@MetodoRecuperaLista * *.*(..)) && target(dao);call(@MetodoRecuperaLista * *.*(..)) && target(dao);
Object around(JPADaoGenerico dao): buscaLista(dao){Object around(JPADaoGenerico dao): buscaLista(dao){
Signature sig = thisJoinPointStaticPart.getSignature();Signature sig = thisJoinPointStaticPart.getSignature();
Method metodo = ((MethodSignature)sig).getMethod();Method metodo = ((MethodSignature)sig).getMethod();
return dao.buscaLista(return dao.buscaLista(
metodo, metodo,
thisJoinPoint.getArgs(), thisJoinPoint.getArgs(),
metodo.getAnnotation(metodo.getAnnotation(
MetodoRecuperaLista.class)MetodoRecuperaLista.class)
.namedQuery());.namedQuery());
}}
Aplicação – Padrão de ProjetoAplicaçã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 ProjetoAplicação – Padrão de Projeto
…@Singletonpublic class PessoaService {… public PessoaService(){ … }…}
Aplicação – 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 – Aplicação – Outras aplicações
• Tratamento de ExceçõesTratamento de Exceções1________________________________________________________
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 – Aplicação – Outras aplicações
• Declaração de erros e warningsDeclaraçã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 – Aplicação – Conclusão
• SimplicidadeSimplicidade• Evitar uso excessivoEvitar uso excessivo• Necessidade de manutençãoNecessidade de manutenção• CompetitividadeCompetitividade
• Trabalhos futuros• Plugin perfeitamente integrado com IDEs• Identificação de interesses ortogonais com IA
Dúvidas?Dúvidas?