Les bases de la Programmation Orientée Aspect
Un peu de vocabulaire
Informations générales
Nous allons maintenant voir un peu plus en détail, les éléments apportés par la Programmation Orientée Aspect. Tout d'abord, il est important de savoir qu'un aspect est similaire à un objet. Il est possède donc des propriétés similaires :
- Instanciation : il est possible d'instancier un aspect à l'aide des méthodes new() et aspectOf()
- Héritage : un aspect peut hériter d'un autre aspect
- Aspect d'un aspect : un aspect peut être appelé par un autre aspect lors de l'exécution d'une des méthodes de cet aspect.
Join Points
Il s'agit d'un point dans le code de notre application où sera intégré le code de notre aspect.
Avec AspectJ les différents Join Points sont les suivants :
- Initialisation d'un objet ou d'une classe
- Appel et exécution d'une méthode
- Accès en lecture ou écriture d'un champ
- Levée d'une exception
- Retour d'une méthode
Pointcuts
Ils représentent la définition syntaxique d'un join point. En AspectJ, ils sont déclarés de la manière suivante :
pointcut {name}({args}) : {type}({expression});
Ils existent différents types de pointcut :
- call / execution : permet de définir un join point au niveau de l'appel ou de l'exécution d'une méthode.
- handler : permet de définir un join point à la levée d'une exception.
- get / set : permet de définir un join point à la lecture ou l'écriture d'un champ d'un objet.
- within : permet de définir un join point lorsque le code est au sein d'un élément (classe, package.).
Quelques exemples :
- pointcut log() : call(* com.aspects.pointcut.DemoClass.*(..)); => Toutes les méthodes de la classe DemoClass.
- pointcut log() : call(public * DemoClass.*(..)); => Toutes les méthodes publique de la classe DemoClass.
- pointcut log() : call(public int DemoClass.*(..)); => Toutes les méthode publique de la classe DemoClass retournant un int.
- pointcut log() : call(public int DemoClass.*(int, ..)); => Toutes les méthode publique de la classe DemoClass retournant un int et ayant comme premier paramètre un int.
- pointcut log() : within(com.aspects.blog.package.*); => Tous les appels au sein du package.
- pointcut log() : within(DemoClass); => Tous les appels au sein de la classe DemoClass
- pointcut log() : within(DemoInterface+); => Tous les appels au sein de l'interface DemoInterface et de ses enfants.
- pointcut log(Object obj) : target(obj) && call(* * DemoClass.*(..)) => Toutes les méthodes de la classe DemoClass et récupération de l'objet concerné.
Advices
Il détermine le moment au sera exécuté le code de l'aspect.
Il existe trois types d'advices :
-
Before advices : exécuté avant le déroulement du join point (traitement pré join point).
-
Around advices : exécuté autour du déroulement du join point (traitement pré et post join point).
-
After advices : exécuté après le déroulement du join point (traitement post join point).