Aop Aspect J 1.5.4 Capitulo 02

19
AOP – AspectJ 1.5.4 Programação Orientada a Aspectos

Transcript of Aop Aspect J 1.5.4 Capitulo 02

Page 1: Aop Aspect J 1.5.4 Capitulo 02

AOP – AspectJ 1.5.4Programação Orientada a

Aspectos

Page 2: Aop Aspect J 1.5.4 Capitulo 02

22PointcutsPointcuts

Page 3: Aop Aspect J 1.5.4 Capitulo 02

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

Page 4: Aop Aspect J 1.5.4 Capitulo 02

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

Page 5: Aop Aspect J 1.5.4 Capitulo 02

PointcutsPointcuts

Sintaxe pointcut <<nome>>(): <<expressao>;

package br.com.targettrust.aop.pointcuts;public aspect PointcutSample { pointcut nomePointcut(): call (void metodoX());}

Page 6: Aop Aspect J 1.5.4 Capitulo 02

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– &&– ||– !

Page 7: Aop Aspect J 1.5.4 Capitulo 02

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()

Page 8: Aop Aspect J 1.5.4 Capitulo 02

Suporte ao Java 5Suporte ao Java 5

• Suporte total:• varargs• enums• annotations• co-variant• generics• boxing

Page 9: Aop Aspect J 1.5.4 Capitulo 02

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.

Page 10: Aop Aspect J 1.5.4 Capitulo 02

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

Page 11: Aop Aspect J 1.5.4 Capitulo 02

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.

Page 12: Aop Aspect J 1.5.4 Capitulo 02

Recursos avançados em pointcutsRecursos avançados em pointcuts

• args/@args• this/@this• target/@target• within/@within• withincode/@withincode• annotation/@annotation

Page 13: Aop Aspect J 1.5.4 Capitulo 02

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*";

Page 14: Aop Aspect J 1.5.4 Capitulo 02

Declaração de errorsDeclaração de errors

declare error : within(br.com.targettrust.aop.*) && call(* deleteAll*(..)) : "Você não deve deletar tudo tche!!!";

Page 15: Aop Aspect J 1.5.4 Capitulo 02

Injeção de anotaçõesInjeção de anotações

• Podemos injetar em:• Classes• Métodos• Construtores• Atributos

Page 16: Aop Aspect J 1.5.4 Capitulo 02

Injeção de anotaçõesInjeção de anotações

• Anotações AspectJ:• @type

• @method

• @constructor

• @field

Page 17: Aop Aspect J 1.5.4 Capitulo 02

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;}

Page 18: Aop Aspect J 1.5.4 Capitulo 02

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

Page 19: Aop Aspect J 1.5.4 Capitulo 02

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.