Upload
diego-pacheco
View
1.327
Download
0
Embed Size (px)
Citation preview
AOP – AspectJ 1.5.4Programação Orientada a
Aspectos
22PointcutsPointcuts
ObjetivosObjetivos
Saber utilizar pointcuts com call e execution
Saber utilizar anotações para aspectosSaber realizar expressões pointcuts
considerando anotaçõesSaber declarar warnings e errosSaber realizar injeção de anotações
PointcutsPointcuts
Join points (11):Chamada de métodoExecução de métodoChamada de construtorExecução de construtorGetter de uma propriedadeSetter de uma propriedadePré-inicializaçãoInicializaçãoInicialização estáticaHandlerAdvice de execução de join points
PointcutsPointcuts
Sintaxe pointcut <<nome>>(): <<expressao>;
package br.com.targettrust.aop.pointcuts;public aspect PointcutSample { pointcut nomePointcut(): call (void metodoX());}
PointcutsPointcuts
package br.com.targettrust.aop.pointcuts;public aspect PointcutLogicalOperators {
pointcut operadorAnd(): call ( String br.com.targettrust.aop.java.domain.model.Pessoa.getNome() )
&& call ( String br.com.targettrust.aop.java.domain.model.PessoaFisica.getNome() ); pointcut operadorOr(): call ( String br.com.targettrust.aop.java.domain.model.Pessoa.getNome() )
|| call ( String
br.com.targettrust.aop.java.domain.model.Pessoa.getEndereco() );
pointcut operadorNot(): call ( ! String br.com.targettrust.aop.java.domain.model.Pessoa.getNome() );
}
• Operadores Lógicos– &&– ||– !
PointcutsPointcuts
• call vs execution• execution:
• Trecho de código em execução• Recursão
• call• Assinatura específica• Chamadas do pai( apenas
estática)• Usa-se withincode()
Suporte ao Java 5Suporte ao Java 5
• Suporte total:• varargs• enums• annotations• co-variant• generics• boxing
Anotações para PointcutsAnotações para Pointcuts
Politica de retençãoCódigo Fonte
São lidas no processo de compilação, mas não são colocadas no class gerado.
Class gerado É a politica de retenção padrão, as informações estão tanto
em tempo de compilação quanto no class gerado.
Runtime São lidas pelo compilador, vão para o class gerado e ainda
podem ser obtidas em tempo de runtime.
Join point match com anotaçõesJoin point match com anotações
Expressão Exemplo de uso
(@Executavel * *) Contém a anotação @Executavel
(!@Executavel * *) Não contém a anotação @Executavel
(@Executavel @Runnable * * ) Que contém as anotações @Executavel e @Runnable
( @(Executavel || Runnable) * *)
Que contém a anotação @Executavel ou a anotação @Runnable
@(br.targettrust..*) Qualquer anotação que esteja no pacote ou subpacote br.targettrust
Join point match com anotaçõesJoin point match com anotações
Expressão Exemplo de uso
@Criavel new(..) Qualquer construtor que tenha a anotação @Criavel
!@Criavel new(..) Qualquer construtor que não tenha a anotação @Criavel. Cuidado com a interceptação de aspectos.
@Criavel new(java.util.List) Qualquer construtor que receba um parâmetro do tipo List.
@Criavel private new(..) Qualquer construtor privado que possua a anotação @Criavel.
Recursos avançados em pointcutsRecursos avançados em pointcuts
• args/@args• this/@this• target/@target• within/@within• withincode/@withincode• annotation/@annotation
Declaração de warningsDeclaração de warnings
declare warning : within(br.com.targettrust.aop.*) && call(* faz*(..)) : "Você não deve chamar métodos com o prefixo faz*";
Declaração de errorsDeclaração de errors
declare error : within(br.com.targettrust.aop.*) && call(* deleteAll*(..)) : "Você não deve deletar tudo tche!!!";
Injeção de anotaçõesInjeção de anotações
• Podemos injetar em:• Classes• Métodos• Construtores• Atributos
Injeção de anotaçõesInjeção de anotações
• Anotações AspectJ:• @type
• @method
• @constructor
• @field
Injeção de anotaçõesInjeção de anotações
public aspect JoinPointMacthWithAnnotationDeclareAnn {
declare @type : br.com.targettrust.aop..* : @Exportavel;
declare @field : br.com.targettrust.aop..* : @Campo;
declare @method : public * br.com.targettrust.aop.DeclareAnnTest4.*(..) :@Metodo;
declare @constructor : br.com.targettrust.aop.DeclareAnnTest3+.new(..) : @Novo;}
Você aprendeu a...Você aprendeu a...
Utilizar pointcuts com call e executionUtilizar anotações para aspectosRealizar expressões pointcut
considerando anotaçõesDeclarar warnings e errorsRealizar injeção de anotações
ExercíciosExercícios
1) Faça um aspecto que intercepte toda criação de objetos que o construtor receba uma String.
2) Faça um aspecto que intercepte toda execução de métodos que recebam um Map como argumento.
3) Faça um aspecto que declare errors se o desenvolvedor instanciar algum objeto do tipo ArrayList.
4) Faça um aspecto que injete anotações em objetos de pacotes DAO.
5) Faça um aspecto que intercepte todas os getters que tenha a anotação @Serializavel no target.