Architectures Logicielles Olivier Caron Polytech Lille Programmation par aspects Aspect-Oriented Programming Olivier Caron (Polytech Lille) Architectures Logicielles AOP 1 / 18 Olivier Caron (Polytech Lille) Architectures Logicielles AOP 2 / 18 Programmation orienté aspects Une nouvelle manière de programmer Nouveau découpage d’une application : un programme + aspects Réutiliser des aspects pour d’autres applications : vers des composants d’aspects Pallier au problèmes de fonctions transverses Olivier Caron (Polytech Lille) Architectures Logicielles AOP 3 / 18 Programmation orienté aspects Une nouvelle manière de programmer Nouveau découpage d’une application : un programme + aspects Réutiliser des aspects pour d’autres applications : vers des composants d’aspects Pallier au problèmes de fonctions transverses Olivier Caron (Polytech Lille) Architectures Logicielles AOP 3 / 18 Programmation orienté aspects Une nouvelle manière de programmer Nouveau découpage d’une application : un programme + aspects Réutiliser des aspects pour d’autres applications : vers des composants d’aspects Pallier au problèmes de fonctions transverses Olivier Caron (Polytech Lille) Architectures Logicielles AOP 3 / 18 Programmation orienté aspects Une nouvelle manière de programmer Nouveau découpage d’une application : un programme + aspects Réutiliser des aspects pour d’autres applications : vers des composants d’aspects Pallier au problèmes de fonctions transverses Olivier Caron (Polytech Lille) Architectures Logicielles AOP 3 / 18 Exemple : serveur Tomcat et Parsing (1/3) Olivier Caron (Polytech Lille) Architectures Logicielles AOP 4 / 18 Exemple : serveur tomcat et Pattern Matching (2/3) Olivier Caron (Polytech Lille) Architectures Logicielles AOP 5 / 18 Exemple : serveur tomcat et Logging (3/3) Olivier Caron (Polytech Lille) Architectures Logicielles AOP 6 / 18 Approche AOP disposer d’un langage d’aspect définir les points de jonction Réaliser le tissage des aspects sur l’application (weaver) Java Code Aspects ... Points de coupe ... Weaver Byte Code Compiler Olivier Caron (Polytech Lille) ... Architectures Logicielles AOP 7 / 18 Approche AOP disposer d’un langage d’aspect définir les points de jonction Réaliser le tissage des aspects sur l’application (weaver) Java Code Aspects ... Points de coupe ... Weaver Byte Code Compiler Olivier Caron (Polytech Lille) ... Architectures Logicielles AOP 7 / 18 Approche AOP disposer d’un langage d’aspect définir les points de jonction Réaliser le tissage des aspects sur l’application (weaver) Java Code Aspects ... Points de coupe ... Weaver Byte Code Compiler Olivier Caron (Polytech Lille) ... Architectures Logicielles AOP 7 / 18 Aspect J et JBoss AOP www.eclipse.org/aspectj (Xerox Lab puis IBM eclipse) Utilisation du langage Java Origine : compilateur statique java (Xerox) dynamique (IBM) Autre implémentation AOP : projet JBoss AOP Olivier Caron (Polytech Lille) Architectures Logicielles AOP 8 / 18 Aspect J et JBoss AOP www.eclipse.org/aspectj (Xerox Lab puis IBM eclipse) Utilisation du langage Java Origine : compilateur statique java (Xerox) dynamique (IBM) Autre implémentation AOP : projet JBoss AOP Olivier Caron (Polytech Lille) Architectures Logicielles AOP 8 / 18 Aspect J et JBoss AOP www.eclipse.org/aspectj (Xerox Lab puis IBM eclipse) Utilisation du langage Java Origine : compilateur statique java (Xerox) dynamique (IBM) Autre implémentation AOP : projet JBoss AOP Olivier Caron (Polytech Lille) Architectures Logicielles AOP 8 / 18 Aspect J et JBoss AOP www.eclipse.org/aspectj (Xerox Lab puis IBM eclipse) Utilisation du langage Java Origine : compilateur statique java (Xerox) dynamique (IBM) Autre implémentation AOP : projet JBoss AOP Olivier Caron (Polytech Lille) Architectures Logicielles AOP 8 / 18 JBoss AOP by example : programme principal public class Main { public s t a t i c void main ( S t r i n g args [ ] ) { Compte c = new Compte ( ) ; c . s e t I d ( " Dupont " ) ; c . setSolde (200) ; System . o u t . p r i n t l n ( c ) ; } } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 9 / 18 JBoss AOP by example : classe Compte public class Compte { p r i v a t e S t r i n g i d ; p r i v a t e double s o l d e ; public Compte ( ) { } public S t r i n g g e t I d ( ) { r e t u r n t h i s . i d ; } public void s e t I d ( S t r i n g v a l u e ) { this . i d =value ; } public double getSolde ( ) { r e t u r n t h i s . s o l d e ; } public void s e t S o l d e ( double v a l u e ) { this . solde=value ; } public S t r i n g t o S t r i n g ( ) { r e t u r n " compte de " + t h i s . i d + " : " + t h i s . s o l d e ; } } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 10 / 18 JBoss AOP by example : aspect-Interceptor package org . j b o s s . aop . a d v i c e ; import org . j b o s s . aop . j o i n p o i n t . I n v o c a t i o n ; public i n t e r f a c e I n t e r c e p t o r { public S t r i n g getName ( ) ; public O b j e c t i n v o k e ( I n v o c a t i o n i n v o c a t i o n ) throws Throwable ; } } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 11 / 18 JBoss AOP by example : point de coupe fichier de coupe : jboss-aop.xml <?xml v e r s i o n = " 1 . 0 " encoding= "UTF−8" ?> <aop> < b i n d p o i n t c u t = " e x e c u t i o n ( p u b l i c ∗ Compte − > ∗ ( . . ) ) " > < i n t e r c e p t o r class= " demoAspect . DemoTrace " / > </ bind > </ aop> Olivier Caron (Polytech Lille) Architectures Logicielles AOP 12 / 18 JBoss AOP by example : DemoInterceptor (1/2) package demoAspect ; import org . j b o s s . aop . j o i n p o i n t . I n v o c a t i o n ; import org . j b o s s . aop . j o i n p o i n t . Me tho dI nv oca ti on ; import org . j b o s s . aop . a d v i c e . I n t e r c e p t o r ; public class DemoTrace implements I n t e r c e p t o r { public S t r i n g getName ( ) { r e t u r n " DemoTrace " ; } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 13 / 18 JBoss AOP by example : DemoInterceptor (2/2) public O b j e c t i n v o k e ( I n v o c a t i o n i n v o c a t i o n ) throws Throwable { S t r i n g nomMethode= " " ; try { Me t h o d I n v o c a t i on mi = ( M eth od Inv oc at ion ) i n v o c a t i o n ; nomMethode = mi . getMethod ( ) . getName ( ) ; System . o u t . p r i n t l n ( " I n t e r c e p t i o n de : " + nomMethode ) ; r e t u r n i n v o c a t i o n . invokeNext ( ) ; } finally { System . o u t . p r i n t l n ( " Q u i t t e r : " +nomMethode ) ; } } } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 14 / 18 JBoss AOP by example : exécution runWithoutAOP : [ j a v a ] compte de Dupont : 200.0 runWithAOP : [ j a v a ] I n t e r c e p t i o n de : s e t I d [ java ] Q u i t t e r : setId [ j a v a ] I n t e r c e p t i o n de : s e t S o l d e [ java ] Q u i t t e r : setSolde [ j a v a ] I n t e r c e p t i o n de : t o S t r i n g [ java ] Q u i t t e r : t o S t r i n g [ j a v a ] compte de Dupont : 200.0 Olivier Caron (Polytech Lille) Architectures Logicielles AOP 15 / 18 Exemple AOP et sécurité public O b j e c t i n v o k e ( I n v o c a t i o n i n v o c a t i o n ) throws Throwable { S t r i n g nomMethode= " " ; try { Me t h o d I n v o c a t i on mi = ( M eth od Inv oc at ion ) i n v o c a t i o n ; nomMethode = mi . getMethod ( ) . getName ( ) ; System . o u t . p r i n t l n ( " I n t e r c e p t i o n de : " + nomMethode ) ; System . o u t . p r i n t l n ( " Permission Denied " ) ; return " " ; / / r e t u r n i n v o c a t i o n . invokeNext ( ) ; / / i c i , pas d ’ appel à l a méthode i n t e r c e p t é e } finally { System . o u t . p r i n t l n ( " Q u i t t e r : " +nomMethode ) ; } } Olivier Caron (Polytech Lille) Architectures Logicielles AOP 16 / 18 JBoss AOP Langage de points de coupe : expressions rationnelles, attributs, flot d’exécution,. . . interception de méthodes annotées (utile JEE) Exemple : (* *->@UneAnnotation(..)) Des aspects réutilisables : exemple aspect de trace d’exécution. JBoss Application Server : Architecture interne AOP Persistance, transaction, sécurité sont des aspects Possibilité d’ajouter de nouveaux aspects ! Olivier Caron (Polytech Lille) Architectures Logicielles AOP 17 / 18 I never finish anyth Olivier Caron (Polytech Lille) Architectures Logicielles AOP 18 / 18