1. Introducci´n
o
AOP
AspectJ
Aplicaci´n de los aspectos
o
Programaci´n Orientada a Aspectos con AspectJ
o
Cursillos Julio 2007
Universidad de Deusto
27 de julio de 2007
Xabier Laiseca Manso
e-ghost (http://e-ghost.deusto.es)
MoreLab (http://www.morelab.deusto.es)
Programaci´n Orientada a Aspectos con AspectJ
o
2. Introducci´n
o
AOP
Situaci´n actual
o
AspectJ
Aplicaci´n de los aspectos
o
Situaci´n actual
o
Metodolog´ m´s utilizada es la OOP
ıa a
Permite dise˜ar jerarqu´ de objetos
n ıas
Ventaja: Facilita el desarrollo de servicios verticales
Problema: Acceso a los servicios horizontales
Dispersi´n de c´digo: Llamadas a distinta funcionalidad
o o
repartidas y repetidas a lo largo de todo nuestro c´digo.
o
Por ejemplo: autenticaci´n y autorizaci´n, logging, etc.
o o
Programaci´n Orientada a Aspectos con AspectJ
o
3. Introducci´n
o
AOP
Situaci´n actual
o
AspectJ
Aplicaci´n de los aspectos
o
Soluci´n
o
Programaci´n orientada a aspectos (AOP)
o
Programaci´n Orientada a Aspectos con AspectJ
o
4. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Introducci´n a la AOP
o
Definici´n: Paradigma de programaci´n que persigue la
o o
modularizaci´n fomentando la separaci´n de conceptos, en
o o
especial los que afectan a otros conceptos de la aplicaci´n.
o
Estilo de programaci´n
o
Factoriza conceptos comunes de la aplicaci´n (crosscutting
o
concerns). Es horizontal
Soluciona la dispersi´n de c´digo
o o
Importante: ¡¡La AOP no sustituye a la OOP, la
complementa!!
Se puede aplicar a otro tipo de programaci´n
o
Programaci´n Orientada a Aspectos con AspectJ
o
5. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Definiciones
Aspecto Funcionalidad que quieres aplicar a otras partes del
c´digo (logging, gesti´n de transacciones, etc.)
o o
Advice Cada una de las cosas que puede hacer un aspecto
(C´digo a ejecutar)
o
JoinPoint Punto del programa en el que se ejecutar´ un advice
a
(antes de un m´todo, despu´s del contructor, etc.)
e e
Pointcut Conjunto de JoinPoints (un conjunto de m´todos
e
d´nde se ejecutar´ un aspecto).
o a
Target El objeto sobre el que se aplicar´ el/los aspecto/s.
a
Introduction Manipular un target para a˜adirle c´digo,
n o
implementaci´n de interfaces, etc.
o
Programaci´n Orientada a Aspectos con AspectJ
o
6. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Tipos de advices
Before Justo antes del JoinPoint.
After returning Despu´s de que la ejecuci´n de JoinPoint termine
e o
’normalmente’ (sin lanzar excepci´n) se ejecuta el
o
advice.
After throwing Si el JoinPoint lanza una excepci´n se ejecuta el
o
advice.
After Despu´s de que termine un JoinPoint, haya
e
excepci´n o no.
o
Around Envuelve la ejecuci´n del JoinPoint, pudiendo
o
ejecutar c´digo antes y despu´s de su ejecuci´n,
o e o
pudiendo incluso evitar la ejecuci´n del JoinPoint.
o
Programaci´n Orientada a Aspectos con AspectJ
o
7. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Weaver
Hemos separado los conceptos, ¿pero como los unimos?
Mediante preprocesador: complica el desarrollo
Mediante postprocesador binario: complica el desarrollo
Compilador especifico para AOP: AspectJ
Durante la carga de clases: lento
En tiempo de ejecuci´n: lento
o
Programaci´n Orientada a Aspectos con AspectJ
o
8. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Weaver
Programaci´n Orientada a Aspectos con AspectJ
o
9. Introducci´n
o
AOP Introduccion
AspectJ Implementaciones
Aplicaci´n de los aspectos
o
Implementaciones
Java: AspectJ, Jakarta Hivemind, JBoss AOP, Spring AOP, ...
Mono/.Net: Aspect#, Aspect.Net, Spring.Net AOP, ...
C++: AspectC++, FeatureC++, ...
C: AspectC, Aspicere2, ...
Tambi´n existen para otros lenguajes: Python, Cobol, Lisp,
e
Ruby, Perl, ...
Programaci´n Orientada a Aspectos con AspectJ
o
10. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Software a utilizar
Eclipse (http://www.eclipse.org)
AspectJ (http://www.eclipse.org/aspectj/)
AspectJ Development Tools (http://www.eclipse.org/ajdt/)
Programaci´n Orientada a Aspectos con AspectJ
o
11. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Introducci´n a AspectJ
o
Dos formas:
Mediante anotaciones (disponible a partir de AspectJ 5)
Para Java 5.0 o superior
Utiliza unicamente el lenguaje Java
´
Mediante sintaxis adicional (disponible en todas las versiones)
Para cualquier versi´n de Java
o
A˜ade nueva sintaxis
n
Programaci´n Orientada a Aspectos con AspectJ
o
12. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un aspecto
Con anotaciones:
import org.aspectj.lang.annotation.Aspect;
1
2
@Aspect
3
public class Aspecto
4
{ ... }
5
Con sintaxis adicional
public aspect Aspecto
1
{ ... }
2
Programaci´n Orientada a Aspectos con AspectJ
o
13. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un pointcut con anotaciones (I)
@<advice-specification>(quot;<pointcut-kind>(
1
[<access-specifier>] <return-type>
2
<class-name>.<method-name>({<arg-type>}) )quot;)
3
4
public void metodo()
5
{ ... }
6
Programaci´n Orientada a Aspectos con AspectJ
o
14. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un pointcut con anotaciones (II)
advice-specification puede tener los valores before, after, ...
pointcut-kind tipo del pointcut. Puede ser execution, call,
staticinitialization, get, ...
access-specifier restricci´n de acceso del m´todo sobre el que se va
o e
aplicar el advice. Puede ser public, protected, private,
static, ... o combinaciones ’l´gicas’.
o
return-type valor de retorno del m´todo sobre el que se va aplicar
e
el advice
Programaci´n Orientada a Aspectos con AspectJ
o
15. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un pointcut con anotaciones (III)
class-name nombre completo (paquete + nombre) de la clase
sobre el que se va aplicar el advice
method-name nombre del m´todo sobre el que se va aplicar el
e
advice, en caso de ser un constructor se
deber´ utilizar la palabra ’new’
a
arg-type tipo de argumento del m´todo sobre el que se va
e
aplicar el advice
Programaci´n Orientada a Aspectos con AspectJ
o
16. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un pointcut con anotaciones (IV)
Otra manera de hacerlo:
@Pointcut(quot;<pointcut-kind>(
1
[<access-specifier>] <return-type>
2
<class-name>.<method-name>({<arg-type>}) )quot;)
3
public void <pointcut-name>()
4
{ ... }
5
6
@<advice-specification>(quot;<pointcut-name>()quot;)
7
public void metodo()
8
{ ... }
9
Programaci´n Orientada a Aspectos con AspectJ
o
17. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejemplo anotaciones (I)
@Before(quot;execution(public void
1
paquete.clase.metodo(String))quot;)
2
3
public void adviceEjemplo()
4
{
5
System.out.println(quot;Antes del metodoquot;);
6
}
7
Programaci´n Orientada a Aspectos con AspectJ
o
18. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejemplo anotaciones (II)
@Pointcut(quot;execution(public void
1
paquete.clase.metodo(String))quot;)
2
public void pointcutEjemplo() {}
3
4
@Before(quot;pointcutEjemplo()quot;)
5
public void adviceEjemplo()
6
{
7
System.out.println(quot;Antes del metodoquot;);
8
}
9
Programaci´n Orientada a Aspectos con AspectJ
o
19. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Definir un pointcut con sintaxis
pointcut <pointcut-name>(): <pointcut-kind>
1
( [<access-specifier>] <return-type>
2
<class-name>.<method-name>({<arg-type>}) );
3
4
<advice-specification>(): <pointcut-name>()
5
{ ... }
6
Programaci´n Orientada a Aspectos con AspectJ
o
20. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejemplo sintaxis
pointcut pointcutEjemplo(): execution
1
(public void paquete.clase.metodo());
2
3
before(): pointcutEjemplo()
4
{
5
System.out.println(quot;Antes del metodoquot;);
6
}
7
Programaci´n Orientada a Aspectos con AspectJ
o
21. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio hola mundo
Crear una clase con main y otro m´todo
e
Crear un aspecto con un advice que imprima por pantalla
’Hola Mundo de los Aspectos!!!’
Aplicar el aspecto al ’otro m´todo’ de la clase
e
Ser´ interesante hacerlo de las tres formas
ıa
Programaci´n Orientada a Aspectos con AspectJ
o
22. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio advice specifications
Probar las diferentes posiblidades de los advices:
@Before
@After
@AfterReturning
@AfterThrowing
@Around
Utilizar el ejercicio de los dibujos animados (1)
Programaci´n Orientada a Aspectos con AspectJ
o
23. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Operadores
Se aplican sobre JoinPoints
Unarios
Not (!)
Binarios
And (&&)
Or (||)
Con lo que hemos visto hasta el momento solo es interesante
el ’or’, pero m´s adelante veremos cuando utilizar el resto
a
Programaci´n Orientada a Aspectos con AspectJ
o
24. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio operadores
Probar el operador ’or’ para aplicar un advice a diferentes
m´todos
e
Utilizar el ejercicio de los dibujos animados (1)
Recomendaci´n: Crear un proyecto nuevo
o
Programaci´n Orientada a Aspectos con AspectJ
o
25. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcut kinds (I)
execution A˜ade el advice dentro del m´todo/constructor sobre
n e
el que se aplica
execution(< patron − metodo >)
Ejemplo: execution(public void
paquete.clase.metodo(String))
call A˜ade el advice antes, despues, ... de la llamada al
n
m´todo/constructor sobre el que se aplica
e
call(< patron − metodo >)
Ejemplo: call(public void
paquete.clase.metodo(String))
Programaci´n Orientada a Aspectos con AspectJ
o
26. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcut kinds (II)
staticinitialization A˜ade el advice antes, despues, ... del
n
constructor de una clase est´tica
a
staticinitialization(< clase >)
Ejemplo: staticinitialization(paquete.clase)
get A˜ade el advice antes, despues, ... de que se lea el
n
contenido del atributo sobre el que se aplica
get(< patron − atributo >)
Ejemplo: get(String paquete.clase.atributo)
Programaci´n Orientada a Aspectos con AspectJ
o
27. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcut kinds (III)
set A˜ade el advice antes, despues, ... de que se escriba
n
el contenido del atributo sobre el que se aplica
set(< patron − atributo >)
Ejemplo: set(int paquete.clase.atributo)
handler Representa los join points en donde se captura una
excepci´n del tipo indicado por la expresi´n. Esta
o o
captura est´ siempre especificada por una cl´usula
a a
catch en Java
handler(< patron − excepcion >)
Ejemplo: handler(paquete.excepcion)
Programaci´n Orientada a Aspectos con AspectJ
o
28. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcut kinds (III)
initialization A˜ade el advice antes, despues, ... de la creaci´n de
n o
una instancia que utilice el constructor indicado
initialization(< patron − constructor >)
Ejemplo: initialization(paquete.clase.new())
preinitialization A˜ade el advice antes, despues, ... de la creaci´n
n o
de una instancia que utilice el constructor indicado
antes de que el constructor super sea llamado
preinitialization(< patron − constructor >)
Ejemplo: preinitialization(paquete.clase.new())
adviceexecution Representa los join points donde se inicia la
ejecuci´n de un advice. No requiere argumentos
o
adviceexecution()
Programaci´n Orientada a Aspectos con AspectJ
o
29. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts basados en la estructura l´xica
e
Capturan JoinPoints dentro del ´mbito l´xico de un aspecto,
a e
clase y/o m´todo
e
Dos tipos:
within: Captura todos los JoinPoints dentro de una clase o
aspecto, incluso dentro de sus clases internas
within(< patron − clase >)
withincode: Captura todos los JoinPoints dentro de un
m´todo, incluso dentro de sus clases locales
e
withincode(< patron − metodo >)
Programaci´n Orientada a Aspectos con AspectJ
o
30. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio Pointcut kinds
Probar los diferentes Pointcut kinds
Utilizar el ejercicio de los dibujos animados (2)
Homer es un singleton y tiene un constructor est´tico
a
(staticinitialization)
PersonajeFuturama sobreescribe el constructor por defecto
(initialization y preinitialization)
Pistas:
Cuidado con el adviceexecution, si no se restringe su aplicaci´no
se aplicara a s´ mismo.
ı
En este ejercicio se tienen que utilizar los operadores ’and’ y
’not’
Programaci´n Orientada a Aspectos con AspectJ
o
31. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts basados en el flujo de control
Capturan JoinPoints en el flujo de contro de un m´todo y/o
e
advice
Dos tipos:
cflow: Captura todos JoinPoints dentro del flujo de control de
un m´todo, constructor, ... incluyendo la llamada
e
cf low(< pointcut − kind > (...))
cflowbelow: Captura todos JoinPoints dentro del flujo de
control de un m´todo, constructor, ... excluyendo la llamada
e
cf lowbelow(< pointcut − kind > (...))
Cuidado: Cuando se quieren utilizar pointcuts basados en el
flujo de control hay que definir dos JointPoint por lo menos
JoinPoint de flujo de control (cflow o cflowbelow)
1
JoinPoint para restringir la aplicaci´n del anterior JoinPoint
o
2
Programaci´n Orientada a Aspectos con AspectJ
o
32. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio de pointcuts basados en el flujo de control
Crear un Pointcut que se aplique a todos los m´todos de la
e
funci´n saludaA de PersonajeSimpsons
o
Cuidado con que el advice sea aplicado sobre si mismo
Comprobar la diferencia entre cflow y cflowbelow
Crear un Pointcut que se aplique solo a la llamada getNombre
de la funci´n saludaA de PersonajeSimpsons
o
Utilizar el ejercicio de los dibujos animados (1)
Recomendaci´n: Crear un nuevo proyecto
o
Programaci´n Orientada a Aspectos con AspectJ
o
33. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts basados en el objeto de ejecuci´n (I)
o
A diferencia de los dem´s Pointcuts, estos se aplican en
a
tiempo de ejecuci´n.
o
Se aplican sobre un objeto.
Dos tipos:
this: se comprueba si el objeto this de Java es de la clase
indicada, en caso de serlo, se aplica el advice. Tambi´n es
e
utilizado para acceder al objeto ’this’ de Java
Ejemplo comprobaci´n clase: this(paquete.Clase)
o
Ejemplo acceso ’this’ de Java:
@Before(quot;this(instancia) && ...quot;)
1
2
public void advice(Object instancia)
3
{ ... }
4
Programaci´n Orientada a Aspectos con AspectJ
o
34. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts basados en el objeto de ejecuci´n (II)
o
Dos tipos (continuaci´n):
o
target: se comprueba si el objeto sobre el que se va a aplicar el
advice es el indicado. Tambi´n es utilizado para acceder al
e
target
Ejemplo comprobaci´n clase: target(paquete.Clase)
o
Ejemplo acceso target:
@Before(quot;target(instancia) && ...quot;)
1
2
public void advice(Object instancia)
3
{ ... }
4
En este tipo de Pointcut no se pueden utilizar los comodines
’*’ y ’..’
El comod´ + es innecesario ya que la herencia de Java ’lo
ın
hace automaticamente’
Programaci´n Orientada a Aspectos con AspectJ
o
35. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio Pointcuts basados en el objeto de ejecuci´n
o
Probar los pointcuts this y target
Ponerlos como unico JoinPoint y probar como funcionan
´
Concatenarlos con otro/otros JoinPoints
Utilizar el ejercicio de los dibujos animados (1)
Recomendaci´n: Crear un nuevo proyecto
o
Programaci´n Orientada a Aspectos con AspectJ
o
36. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts de argumentos (I)
Permiten a˜adir contexto al advice
n
Se pueden aplicar a:
M´todos/constructores: Permiten acceder a los par´metros del
e a
m´todo o constructor
e
@Before(quot;args(arg1) && ...quot;)
1
2
public void advice(<tipo> arg1)
3
{ ... }
4
Programaci´n Orientada a Aspectos con AspectJ
o
37. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts de argumentos (II)
Se pueden aplicar a (continuaci´n):
o
Atributos: Permite consultar el nuevo valor que se le va a
asignar
@Before(quot;args(nuevoValor) && ...quot;)
1
2
public void advice(<tipo> nuevoValor)
3
{ ... }
4
Excepciones: Permite acceder a la excepci´n que ha sido
o
lanzada
@Before(quot;args(e) && ...quot;)
1
2
public void advice(<excepcion> e)
3
{ ... }
4
Programaci´n Orientada a Aspectos con AspectJ
o
38. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio pointcuts de argumentos
Utilizar los tres tipos de pointcut
En el del atributo, obtener el valor viejo y el nuevo
Utilizar el ejercicio de los dibujos animados (1)
Recomendaci´n: Crear un nuevo proyecto
o
Programaci´n Orientada a Aspectos con AspectJ
o
39. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Pointcuts condicionales
Permiten realizar comprobaciones antes de aplicar el advice
Solo hay un tipo:
if: Permite que el pointcut devuelva un ’boolean’. Si este
’boolean’ es ’true’ entonces se ejecuta el advice
@Pointcut(quot;if() && ...quot;)
1
public static boolean ifPointcut()
2
{ <comprobacion> }
3
4
@Before(quot;ifPointcut() && ...quot;)
5
public void ifAdvice()
6
{ ... }
7
Programaci´n Orientada a Aspectos con AspectJ
o
40. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio pointcuts condicionales
Sacar un mensaje por pantalla cuando se intente asignar un
nombre vacio ( o null) a un personaje
Sacar por pantalla un mensaje cuando se alguien salude a
Homer
Utilizar el ejercicio de los dibujos animados (1)
Recomendaci´n: Crear un nuevo proyecto
o
Programaci´n Orientada a Aspectos con AspectJ
o
41. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Uso de caracteres comod´
ın
Asterisco (*):
Clase: Representa cualquier caracter
cursillo.* : Cualquier clase del paquete ’cursillo’
cursillo.*.Coche : Todas las clases llamadas ’Coche’ dentro de
los subpaquetes hijo de ’cursillo’
Metodo o constructor: Representa cualquier caracter
cursillo.Alumno.get*(*) : Todos los m´todos que empiecen por
e
get y que tengan un parametro de la clase ’cursillo.Alumno’
Atributo: Representa cualquier caracter
cursillo.Alumno.a* : Todos los atributos que empiecen por ’a’
de la clase ’cursillo.Alumno’
Programaci´n Orientada a Aspectos con AspectJ
o
42. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Uso de caracteres comod´
ın
Dos puntos (..):
Paquete: Representa al paquete actual y a todos sus
subpaquetes (directos e indirectos)
javax..* : Todas las clases de javax, javax.util, javax.swing, ...,
javax.util.logging, ..., javax.swing.tree, ...
Metodo o constructor: Representa un n´mero variable de
u
parametros
cursillo.Alumno.*(..) : Todos los m´todos de la clase
e
’cursillo.Alumno’
cursillo.Alumno.*(String, ..) : Todos los m´todos que tengan
e
un primer parametro de tipo ’String’ de la clase
’cursillo.Alumno’
Programaci´n Orientada a Aspectos con AspectJ
o
43. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Uso de caracteres comod´
ın
Operador suma (+):
Clase o interfaz: Representa a las clases hijas o que
implementan la clase o interfaz
cursillo.Alumno+ : Todas las clases que extienden o
implementan de ’cursillo.Alumno’
Programaci´n Orientada a Aspectos con AspectJ
o
44. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Ejercicio caracteres comodin
Probar los diferentes caracteres comod´ ın
Utilizar el ejercicio de los dibujos animados (1). Aprovechar ...
... la jerarquia de clases
... los diferentes paquetes
... similitudes de nombres (PersonajesSimpsons,
PersonajesFuturama)
...
Recomendaci´n: Crear un nuevo proyecto
o
Programaci´n Orientada a Aspectos con AspectJ
o
45. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Static crosscutting (I)
En ocasiones modificar el comportamiento mediante un advice
no es suficiente, es necesario modificar la estructura est´tica
a
de la clase
Dos tipos de crosscuting:
Dynamic crosscutting: modifica el comportamiento de la
ejecuci´n
o
Static crosscutting: modifica la estructura de los tipos
Programaci´n Orientada a Aspectos con AspectJ
o
46. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Static crosscutting (II)
Se basa en el concepto ’introduction’ anteriormente explicado.
Recordatorio:
Manipular un target para a˜adirle c´digo, implementaci´n de
n o o
interfaces, etc
Tres tipos de modificaciones:
Member/method introduction: Permite a˜adir m´todos y
n e
atributos
Modificaci´n de la jerarquia de clases: Permite implementar
o
interfaces y extender clases
Introducci´n de errores y warnings en tiempo de compilaci´n:
o o
Permite comprobar si se aplican aspecto no esperados
Programaci´n Orientada a Aspectos con AspectJ
o
47. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Static crosscutting (III)
Ejemplo member/method introduction:
<access-specifier> <type> <class>.<member-name>;
1
2
<access-specifier> <return-type>
3
<class>.<method-name>()
4
{ ... }
5
access-specifier Puede ser public, protected o private
type Tipo del atributo
class Clase a la que se le a˜ade el m´todo o atributo
n e
member-name Nombre del atributo
return-type Tipo de retorno del m´todo
e
method-name Nombre del m´todo e
Programaci´n Orientada a Aspectos con AspectJ
o
48. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Static crosscutting (IV)
Ejemplo modificaci´n de la jerarquia de clases
o
declare parents: <child-type-pattern>
1
implements <interface-list>;
2
3
declare parents: <child-type-pattern>
4
extends [<class> | <interface-list>];
5
child-type-pattern Patr´n de clases que van a
o
implementar/extender otra interfaz/clase
interface-list Lista de interfaces que se quieren implementar
class Clase que se quiere extender
Programaci´n Orientada a Aspectos con AspectJ
o
49. Introducci´n
o
Introducci´n
o
Sintaxis b´sica
a
AOP
Pointcut kinds
AspectJ
Uso de caracteres comod´
ın
Aplicaci´n de los aspectos
o
Static crosscutting
Static crosscutting (V)
Ejemplo introducci´n de errores y advertencias en tiempo de
o
compilaci´n
o
declare error: <pointcut> : <message>;
1
2
declare warning: <pointcut> : <message>;
3
pointcut Pointcut en el que, en caso de aplicar un advice,
aparecer´ el error o la advertencia
a
message Mensaje a mostrar en el error o advertencia
Programaci´n Orientada a Aspectos con AspectJ
o
50. Introducci´n
o
AOP Introducci´n
o
AspectJ Ejemplos
Aplicaci´n de los aspectos
o
Introducci´n a la aplicaci´n de aspectos
o o
¿Donde aplicar todo esto?
Logging, tracing y profiling
Aplicaci´n de politicas
o
Optimizaci´n: Pools y caches
o
Patrones de dise˜o
n
Autenticaci´n y autorizaci´n
o o
Gesti´n de transacciones
o
...
Programaci´n Orientada a Aspectos con AspectJ
o
51. Introducci´n
o
AOP Introducci´n
o
AspectJ Ejemplos
Aplicaci´n de los aspectos
o
Ejemplos
Logging
Caches
Reglas de negocio
Programaci´n Orientada a Aspectos con AspectJ
o