Comparaison des outils de développement AOP en Java basée sur l'article de Mik Kersten. Fabrice Bodmer & Timothée Maret Université de Fribourg, Juin 2006
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 2
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 3
1. Introduction : Article de référence Mik Kersten. AOP tools comparison, décembre 2005 Comparaison des quatre outils AOP les plus populaires en Java. (AspectJ,JBoss,AspectWerkz,Spring) Evolutions majeures pour la plupart des outils. Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 4
1. Introduction : Comparaison 1. Mise en oeuvre des aspects 2. Fonctionnalite s du langage 3. Modes de weaving 4. Inte gration avec les IDE 5. Domaines d application Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 5
1. Introduction : Exemple de démonstration public class Test { public static void main(string[] args) { Inventory inventory = new Inventory(); Item item1 = new Item("1", 30); Item item2 = new Item("2", 31); Item item3 = new Item("3", 32); inventory.additem(item1); inventory.additem(item2); inventory.additem(item3); ShoppingCart sc = new ShoppingCart(); ShoppingCartOperator.addShoppingCartItem(sc, inventory, item1); ShoppingCartOperator.addShoppingCartItem(sc, inventory, item2); } } Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 6
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 7
2.1. AspectWerkz Premier langage AOP pour Java par BEA Systems Mise en oeuvre par des fichiers XML Weaving dynamique Fusion dans AspectJ 5 Arrêt du développement avec la version 2.0 Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 8
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 9
2.2. AspectJ : Présentation Evolution majeure depuis le 20 décembre 2005, AspectJ 5 Compilateur/weaver ajc (weaving dynamique/statique) Conçu pour des applications standalone Large palette de fonctionnalités Supporte les fonctionnalités de Java 1.5 Trois méthodes de déclaration des aspects Les annotations Java 1.5 Extension du langage Java Fichier XML (dynamique) Plugin ajdt pour Eclipse Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 10
2.2. AspectJ : Exemple 1, ajc post compile time Annotations contenues dans les fichiers.class et permettant d'insérer les aspects après la compilation import org.aspectj.lang. ; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; @Aspect public class TraceAspectV1Annotations { @Pointcut("execution(. (..)) execution(.new(..)) &&!within(traceaspectv1annotations)") void tracemethods() {} @Before("traceMethods()") public void process(joinpoint.staticpart thisjoinpointstaticpart) { Signature sig = thisjoinpointstaticpart.getsignature(); System.out.println("Entering [" + sig.getdeclaringtype().getname() + "." + sig.getname() + "]"); } } Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 11
2.2. AspectJ : Exemple 2, ajc load time weaving Injection dans le chargeur de classe par un agent aspectjweaver.jar Configuration du weaver dans le fichier META-INF/aop.xml import org.aspectj.lang.*;... @Aspect public abstract class TraceAspectV1AbstractAnnotations { @Pointcut abstract void tracemethods(); } @Before("traceMethods()")... <aspectj> <aspects> <! définition de l aspect > <concrete aspect name="traceaspectv1" extends="traceaspectv1abstractannotations"> <pointcut name="tracemethods" expression="execution(. (..)) execution(.new(..))" /> </concrete aspect> </aspects> <weaver options="nowarn" /> </aspectj> Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 12
2.2. AspectJ : Code décompilé Décompilation des classes Item.class (listing 6) TraceAspectV1.class (listing 7) L'Aspect implémente un Singleton L'Advice est converti en une méthode dont le nom contient des informations sur lui même ajc$before$traceaspectv1$1$b314f86e thispoinpointstaticpart est ajouté en paramètre La classe Item contient un membre statique pour chaque JoinPoint Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 13
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 14
2.3. Spring : Présentation Conteneur léger, modulaire (librairies.jar) Gestion de l'instanciation des beans dans un fichier XML Evolution majeure avec la version 2.0 (2 juin 2006) Simplification de la syntaxe des fichiers de configuration Compatibilité poussée avec AspectJ Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 15
2.3. Spring AOP : Présentation Fonctionnalités limitées Weaving dynamique Pas de compilateur spécifique Implémentation par des Proxy dynamiques Adoption optionnelle de la syntaxe AspectJ Plugin Eclipse «léger» Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 16
2.3. Spring : Exemple 3 Spring AOP Aspect implements MethodBeforeAdvice (listing 8) Méthode de test (listing 9) Configuration des beans dans loggingaspectbase.xml (listing 10) Utilisation de CGLIB Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 17
2.3. Spring : Exemple 4 Spring/AspectJ Aspect par annotations (cf exemple 1) Configuration du weaver <!DOCTYPE aspectj PUBLIC " //AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <weaver> <include within="ch.unifr.aop.dynamic.. "/> </weaver> <aspects> <aspect name="ch.unifr.aop.dynamic.traceaspectv1annotations"/> </aspects> </aspectj> Configuration des beans dans loggingaspect.xml (listing 12) Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 18
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 19
2.4. Jboss AOP : Présentation Présentation de Jboss AOP Jboss AOP Jboss AS Standalone Intégré à Jboss AS Conforme au langage Java Jboss fournit des aspects prédéfinis Gestion d'un cache Sécurité Transactions etc. Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 20
2.4. Jboss AOP : Implémentation des aspects Pointcuts Expression : [access] [static] ReturnType Class->method([args]) Jokers : *,.. Sous types de classe: instanceof() Modificateur :! Composition des advices!, AND, OR, (, ) Déclaration jboss-aop.xml Annotations java (dans l'expr. aussi) Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 21
2.4. Jboss AOP : Implémentation des aspects Advices Aspect = classe java Advice = méthode java Pas d'interface ou de classe abstraite! 1 argument de type Invocation Throws Throwable Retourne une instance d'object return invocation.invokenext(); Un seul type d'advice: around Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 22
2.4. Jboss AOP : Implémentation des aspects Contexte du join point On ne déclare pas les attributs du join point dans le pointcut On procède par casting des objets accessibles au travers de l'argument Invocation de l'advice Selon le pointcut, l'argument de l'advice peut être une classe fille de Invocation MethodInvocation FieldInvocation... Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 23
2.4. Jboss AOP : Autres possibilités Introduction Forcer une classe à implémenter une interface <introduction expr="has(* *->additem(..)) OR class(someclass.*)"> <interfaces>java.io.serializable</interfaces> </introduction> Mixin Idem + introduction du code implémentant l'interface <introduction class="shoppingcart"> <interface>getnameinterface</interface> <class>shoppingcartmixin</class> <construction>new ShoppingCartMixin(this)</construction> </introduction> Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 24
2.4. Jboss AOP : Autres possibilités cflow stack «équivalent» des advices de contrôle de flux Un cflow stack définit une suite d'appels <cflow-stack name="recursive"> <called expr="void MaClasse->UneMethode(..)"/> <called expr="void MaClasse->UneMethode(..)"/> <not-called expr="void MaClasse->UneMethode(..)"/> </cflow-stack> Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 25
2.4. Jboss AOP : Hot deployment Ajout et suppression d'advices durant l'exécution Dans le cadre de Jboss AS, il suffit de modifier le fichier de configuration des aspects pour modifier le comportement du programme AdviceBinding b = new AdviceBinding("execution(ShoppingCart->*(..))", null); b.addinterceptor(traceinterceptor.class); AspectManager.instance().addBinding(b); Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 26
2.4. Jboss AOP : Compilation & exécution Le weaving peut se faire selon 3 modes Lors de la précompilation Lors du chargement Lors de l'exécution Javassist Abstraction du bytecode dans une structure de données API pour manipuler le bytecode Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 27
2.4. Jboss AOP : weaving weaving Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 28
2.4. Jboss AOP : weaving Le code source de ShoppingCartOperator passe de 15 à 311 lignes! Délégation des créations d'instances, des appels de méthodes et des accès aux champs Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 29
2.4. Jboss AOP : IDE Plugin Eclipse Jboss IDE Assistant pour la création de pointcuts AspectManager view Gestion des entités définies dans jboss aop.xml Advised members view Affiche les membres «advisés» de la classe courante Ne supporte pas les annotations Instable Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 30
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 31
3. Comparaison: mise en oeuvre des aspects A l'origine, ce qui différentiait les outils était la mise en oeuvre des aspects: 1. Code 2. XML 3. Annotations Déclaration des pointcuts et des advices Ensemble (1 & 3) Séparément (2 (& 1)) Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 32
3. Comparaison: mise en oeuvre (suite...) Validation statique Support de l'ide Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 33
3. Comparaison: mise en oeuvre des aspects Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 34
3. Comparaison: fonctionnalités Les trois outils étudiés partagent les même principes Join point, pointcut, advice, injection Les expressions de matching des pointcuts sont très similaires AspectJ permet une définition très précise du join point Permet le pointcut if Permet la définition du contexte Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 35
3. Comparaison: fonctionnalités Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 36
3. Comparaison: fonctionnalités Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 37
3. Comparaison: weaving Compile time AspectJ Jboss AOP Load time AspectJ Jboss AOP Spring AOP Run time Jboss AOP Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 38
3. Comparaison: support des IDE AspectJ Plugin officiel pour Eclipse Bon support, vérification statique, autocomplétion, etc. Certaines fonctionnalités d'eclipse ne sont pas supportées (ex: refactoring) Jboss AOP Plugin officiel pour Eclipse Support limité, uniquement XML (pas de support des annotations) Spring AOP Plugin officiel du framework Spring pour Eclipse Pas d'assistance pour la création des aspects Editeur XML pour la définition des joinpoints Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 39
Plan 1. Introduction 2. Présentation des outils 1. AspectWerkz 2. AspectJ 3. Spring 4. Jboss AOP 3. Comparaison 4. Conclusion Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 40
4. Conclusion Il y a eu un nivellement vers le haut des outils. On va plutôt choisir l'un ou l'autre en fonction des technologies qui entourent les outils: Jboss AS pour Jboss AOP Spring pour Spring AOP AspectJ est probablement l'implémentation d'aop la plus puriste et la plus aboutie. Elle est supportée par une communauté d'une certaine taille. Jboss AOP nécessite plus de bricolage, mais propose plus ou moins les mêmes fonctionnalités. Spring AOP est intéressant dans le cadre du framework Spring. Université de Fribourg, juin 2006 Fabrice Bodmer & Timothée Maret 41