• Aucun résultat trouvé

C HAPITRE 2 : A SPECT J &

2 JBOSS AOP

1.1 Le concept d’aspect

AspectJ étend la syntaxe de Java avec de nouveaux mots-clés. Le premier que nous rencontrons ici est aspect.

Pour AspectJ un aspect est une entité logicielle très similaire à une classe (Le mot-clef class est juste remplacé par aspect). Un aspect a un nom, et peut être définit dans des packages, il peut aussi être étendu par héritage. Son rôle est de définir une préoccupation comme fait une classe. Bien que les différences se situent dans le caractère transversal de la préoccupation modularisée et dans la logique d’intégration liée a un aspect, classes et aspects sont des entités de même niveau, qui doivent obéir aux mêmes règles, dans la mesure du possible.

Les aspects AspectJ comportent des coupes et des codes advice. Les sections qui suivent détaillent ces éléments.

Les types de points de jonction fournis par AspectJ peuvent concerner des méthodes, des attributs, des exceptions, des constructeurs ou des blocs de code statiques. Un dernier type concerne les exécutions de codes advice.

Le tableau suivant résume les différents types de point de jonction offerts par AspectJ [Meslati, 2006].

Tableau 1 Signification prédicative des points de jointure primitifs et leur composition dans AspectJ

1.3 Le concept de coupe

À l'intérieur d'un aspect, le mot-clé pointcut définit une coupe. D'une façon générale, un aspect peut comporter autant de coupes que nécessaire.

Une coupe peut être anonyme et associée directement à un code advice. Il est en effet inutile de nommer une coupe si elle n'est utilisée que dans un seul code advice.

Avec AspectJ, une coupe a la syntaxe suivante :

1 pointcut nomDeLaCoupe(paramètres) : 2 définitionDeLaCoupe

26

Chaque coupe est associée à une expression, qui définit son ensemble de points de jonction. Les points de jonction sont typés, et chaque type est associé à un mot- clé. Une expression de coupe peut comporter des points de jonction de types différents.

Exemple d’un point de coupure qui contient un seul point de jonction de type call

1 pointcut nomDeLaCoupe (): // Coupe

2 call(public int nomClasse. nomMethode()); //point de jonction de type call

Remarque : Il est à noter que les déterminations des point de jonctions, utilisent

des caractères spéciaux appelés wildcards1.

1.4 Le concept de consigne (Advice)

Nous avons vu que les coupes permettaient de décrire ou les instructions d'aspect devaient être ajoutées dans un code métier. Les codes advice définissent quant à eux les instructions d'aspect proprement dites.

De la même façon que les méthodes définissent le comportement d'une classe, les codes advice définissent le comportement d'un aspect. Plusieurs codes advice peuvent être définis dans un aspect. Chaque code advice fournit une série d'instructions écrites dans un bloc de code. Il possède également un type et est attaché à une coupe.

AspectJ fournit cinq types de code advice, les trois types principaux, before,

after et around,, et deux types supplémentaires, after returning et after throwing.

Ces derniers sont des raffinements du type after.

En plus de son type, un code advice est associé à une coupe. Par rapport aux points de jonction désignés par la coupe, le type d'un advice définit le moment auquel nous souhaitons que le bloc de code soit exécuté. Globalement, le bloc de code peut être exécuté avant ou après les points de jonction.

1.5 Le concept d’introduction

Comme nous l’avons expliqué dans le chapitre précédent, le mécanisme d'introduction permet d'introduire de nouveaux éléments structuraux au code d'une application.

En AspectJ ce mécanisme est connu aussi sous la désignation « déclarations inter-types », il permet de déclarer des membres dans des classes prédéfinies, ou de changer les relations d'héritages entre les classes de l’application.

Les six catégories d'éléments suivantes peuvent être ajoutées par le mécanisme d'introduction d'AspectJ : attribut, méthode, constructeur, classe héritée, interface implémentée et exception.

Le code suivant montre un exemple de déclarations inter-type. Il s'agit d'ajouter et initialiser un attribut disabled de type Boolean à la classe Server:

1 boolean Server.disabled = false;

L'instruction suivante permet de déclarer que les deux classes Point et Line héritent de la classe GeometricObject :

1 declare parents : (Point || Line) extends GeometricObject ;

1 AspectJ fournit un mécanisme permettant, à l'aide des symboles *, .. et +, de créer des

expressions englobant plusieurs méthodes. Ce mécanisme produit une syntaxe riche permettant de décrire facilement de nombreuses coupes.

1.6 Le concept de tissage

L’opération de tissage en AspectJ peut être effectuée en trois étapes différentes dans le processus de développement d’une application. Ces trois possibilités sont listées ci-dessous :

 Lors de la compilation (Compile-time weaving) Cette méthode est la plus simple à mettre en œuvre c’est une méthode statique qui utilise uniquement les fichiers sources du programme. Le compilateur ajc d’AspectJ procède en deux opérations, la première consistant à compiler l’application, la deuxième consistant à effectuer l’opération d’injection du code correspondant aux aspects.

 Après la compilation (Post-compile weaving) Cette méthode permet d’injecter du code associé à un aspect lorsque les fichiers sont déjà compilés. Les fichiers peuvent êtres contenus soit dans des .class soit dans des fichiers .jar.

 Lors du chargement du programme (Load time weaving)1

Cette méthode permet d’injecter le code associé aux aspects, durant la phase de chargement de classe dans le class loader. Le chargeur de classe est adapté par un agent gérant la modification des classes lorsqu’elles sont chargées. AspectJ a toujours supporté un mode loadtime weaving dans son framework, cependant depuis la version 1.5, l’intégration est plus aisée et le développement se base uniquement sur un fichier de configuration aop.xml. Ce fichier contient la déclaration des aspects devants êtres appliqués sur les classes. Il est aussi possible de réaliser des aspects abstraits directement dans le fichier XML. Cette fonctionnalité permet par exemple d’adapter un aspect en modifiant uniquement la définition des Pointcut dans le fichier XML, sans toucher au code Java [AspectJ, Web].