Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Aspect avec Spring AOP

on

  • 12,189 views

Architecture et développement d'applications Java avec le Framework Java Spring AOP (Aspect Oriented Programming).

Architecture et développement d'applications Java avec le Framework Java Spring AOP (Aspect Oriented Programming).

Statistics

Views

Total Views
12,189
Views on SlideShare
11,736
Embed Views
453

Actions

Likes
7
Downloads
911
Comments
1

4 Embeds 453

http://myartaud.free.fr 422
http://www.slideshare.net 29
http://antilloo.com 1
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • guerguelah
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Aspect avec Spring AOP Aspect avec Spring AOP Presentation Transcript

    • Niveau : simple avancé expert Public : Dévelopeur Architecte Manager Architecture Orientée Aspect « framework Java Spring AOP & AspectJ» Comment isoler le code technique du code métier ? « Aspect Oriented Programed - AOP » « Separation Of Concerns - SoC » Catégorie : veille technologique Auteur : Jimmy Michel SIMEON Version éditoriale : 3.3, le 21 mai 2005
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Agenda Origine du framework Spring AOP Objectif de la Programmation Orientée Aspect Architecture Orientée Aspect et Service Orienté Architecture Modélisation UML des Aspects Méthode de création Top/down ou Down/top des Aspects Outils de développement Spring AOP/AspectJ Syntaxe de tissage d’Aspects dans le code métier Benchmark des API d’Aspects Points forts et faibles de la programmation par Aspects Nouvelles Technologies (POO, POA, Méta-POO, MDA)
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Emergence de la programmation orientée Aspect La programmation orientée aspect est l'une des 10 technologies clés, qui selon le MIT, quot;changeront le mondequot;. « L’implémentation d’une préoccupation applicative est soit un composant soit un aspect »
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Historique de la Programmation Orientée Aspect 1991, publication de Mr Gregor Kiczales coauteur « the Art of the Meta-Object protocol » 1996, Mr Gregor Kiczales responsable de l’équipe AOP chez XEROX PARC en Californie USA, 1997, présentation de l’AOP à l’ECOOP (European Conference on Object-Oriented Programming) langage D (JavaD) Christina Lopez, antérieur à Java AspectJ. Aspect-oriented software development (AOSD) Aspect-Oriented Software Association http://aosd.net/ http://www.parc.xerox.com/research/csl/projects/aspectj/default.html Recherche supportée par PARC, NIST ATP and DARPA
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Gains de la programmation orientée aspects Jean-Yves Guyomarc'h, mai 2006, thèse M.Sc., http://www.yann-gael.gueheneuc.net/Work/Tutoring/Documents/Thesis+of+Jean-Yves+Guyomarch.doc.pdf
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Origine du Framework Spring Créer par Rod JOHNSON et Juergen HOELLER en 2003 Logiciel OpenSource 20 développeurs développent le noyau Spring sur le site Sourceforge.net (en 2005) Publications : « Expert One on One J2EE Design and Development », en 2002 J2EE Development without EJB Historique des versions Spring : v0.9 le 24/06/2003, v1.0 le 24/03/2004, v1.1 le 04/09/2004, v 1.2 le 13/05/2005, v1.2.6 le 14/11/2005. Site Web http://www.springframework.org Support commercial http://www.springframework.com/ Communauté http://www.thespringexperience.com Documentation http://www.springframework.net Forum http://forum.springframework.org/
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Fondateurs du Frameworks Spring
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Architecture de Spring, Conteneur léger, intégrateur de frameworks tech. Conteneur léger = indépendance par rapport au serveur d’application (conteneur lourd) Assembleur de frameworks = intégrateur de frameworks tiers (intra et inter couches) Portabilité des composants métiers = indépendance du code métier par rapport au code technique et du serveur d’application AspectJ AOP Intégration Solutions tiers Spring AOP Intégration Spring Noyau JRE JAVA Exécution Serveur d’Application JAVA
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Acteurs du marché AOP (bonne pratique AOP des experts en développements) Aspect Oriented Programming (Frameworks AOP), Separation Of Concerns (SoC). Gregor Kiczales XEROX PARC : père de l’AOP et du framework AspectJ AspecJ appartient à la communauté Eclipse / IBM Jonas Bonér : framework AspectWerkz BEA Systems AspectWerkz fusionne avec AspectJ ! Bill Burke : Leader JBoss AOP AOP alliance Rod Johnson : Framework Spring AOP, AOP alliance auteur du livre «J2EE without EJB» Conteneurs léger (couplage lâche) vs conteneur lourd (couplage fort),
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Tisseurs d'aspects pour différents langages En Java : Spring AOP, AspectJ (http://eclipse.org/aspectj/) et AspectWerkz = AspectJ 5 JAC (http://www.aopsys.com/jac.html) (Java Aspect Components) JBoos AOP, Hyper/J,etc. En C : Aspect-C (http://www.cs.ubc.ca/labs/spl/projects/aspectc.html) En C++ : AspectC++ (http://www.aspectc.org/) En C#, VB.NET : AspectDNG (http://sourceforge.net/projects/aspectdng/) Aspect#, LOOM.NET En PHP : PHPaspect (http://phpaspect.org) En Cobol AspectCobol (http://homepages.cwi.nl/~ralf/AspectCobol/slides.pdf) etc.
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Les trois étapes de l’approche AOP 1. Identifier les préoccupations techniques 2. Implémenter chaque aspect technique dans une unité appelé un “Aspect” 3. Tisser les préoccupation avec un tisseur (Weave the concerns with a weaver) Tissage à l’exécution (dynamique) ou à la compilation (tissage statique) Busines s logic ss de ion tre pat c Tissage pe ccu modules Besoins So é pr
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Visualisation des catégories d’aspects techniques dans un programme Id en tifi ca tio n de sA sp ec ts te ch niq ue sd an sl e co de m ét ier
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Modularisation des Aspects techniques transverses (séparation du code métier et du code technique) Trois Aspects extraits du code métier Code Métier sans Aspects techniques Public class BusinessMethod(String arg) { Public class BusinessMethod(String arg) { 1ier Configuration Aspect Spring TRANSACTION Balises XML AOP du framework SPRING Aspect 2 ième Code Aspect SECURITE développé Public class Classe MySecurityAspect{ … } Aspect 3 ième Code Aspect LOGGING développé Public class Classe MyLoggingyAspect{ … } Aspect Configuration Spring Configuration des Aspects
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Modularité d’une préoccupation transverse Comment extraire le code technique du code métier Aspects techniques SessionInterceptor StandardManager StandardSessionManager Aspect n package org. apac he.to mcat. reque st; pub lic i nt b efore Body( Requ est r requ est, Respo nse r espon se ) { import org.a pach e.tom cat.c ore.* ; Stri ng r eqSes sionI d = r espon se.g etSes sionI d(); import org.a pach e.tom cat.u til.* ; if( debu g>0 ) cm.l og(quot;B efore Bod y quot; + reqS essio nId ) ; import java. io.* ; if( reqS essio nId== null) package org. apac he.to mcat. sessi on; package org. apac he.to mcat. sessi on; // ---- ----- ---- ----- ----- ----- ----- ---- ----- ----- ----- ----- Pub lic M ethod s import java. net. *; retu rn 0; // ----- ---- ----- ----- ----- ----- ---- ----- ----- ----- ----- - Li fecyc le Me thods import java. util .*; import java. io.I OExce ption ; import javax .ser vlet. http. *; import java. util .Enum erati on; import java. io.I OExce ption ; // G S, s et th e pat h att ribut e to the cooki e. Th is wa y import java. util .Hash table ; /** import javax .ser vlet. http. Cooki e; /** /** // m ulti ple s essio n coo kies can be us ed, o ne fo r eac h import java. util .Vect or; * Confi gure this comp onent , bas ed o n the spec ified conf igur ation * Will proc ess the r eques t and dete rmin e the sess ion I d, an d se t it // c onte xt. import org.a pach e.tom cat.c atali na.*; * param eter s. T his m ethod shou ld b e cal led i mmedi ately aft er th e import javax .ser vlet. http. HttpS essio n; * Mark the speci fied sessi on's last acce ssed time. Thi s sh ould be * in t he Re ques t. Stri ng s essio nPath = rr eques t.ge tCont ext() .getP ath() ; import javax .ser vlet. http. Cooki e; * compo nent inst ance is cr eated , an d bef ore < code> start ()</ code> import org.a pach e.tom cat.c atali na.*; * calle d fo r eac h req uest by a Requ estIn terce ptor. * It a lso m arks the sessi on as acce ssed . if(s essi onPat h.len gth() == 0 ) { import javax .ser vlet. http. HttpS essio n; * is ca lled . * sess ionPa th = quot;/quot;; import org.a pach e.tom cat.u til.S tring Mana ger; * import org.a pach e.tom cat.c ore.C ontex t; * * This impl emen tatio n onl y han dles Cook ies s essio ns, p lease ext end o r } import org.w 3c.d om.Na medNo deMap ; * @para m pa ramet ers C onfig urati on p arame ters for t his c ompo nent import org.a pach e.tom cat.c ore.R eques t; * @para m se ssion The sessi on to be marke d * add new i nter cepto rs fo r oth er me thod s. import org.w 3c.d om.No de; * (<B> FIXM E: Wh at ob ject type shou ld th is re ally be?) Aspect ... * // G S, p iggyb ack t he jv m rou te o n the sess ion i d. * import org.a pach e.tom cat.c ore.R espon se; */ */ if(! sess ionPa th.eq uals( quot;/quot;)) { * @exce ptio n Ill egalS tateE xcept ion if th is co mpone nt ha s al ready been import org.a pach e.tom cat.c ore.S essio nMan ager; pub lic v oid acces sed(C ontex t ctx , Re quest req, Stri ng id ) { public class Ses sionI nterc eptor exte nds Base Inter cepto r imp leme nts R eques tInte rcept or { Stri ng jv mRout e = r reque st.g etJvm Route (); /** * conf igur ed an d/or start ed if(n ull ! = jvm Route ) { * Stan dard impl ement ation of t he <b >Man ager< /b> i nterf ace t hat provi des * @exce ptio n Lif ecycl eExce ption if this compo nent detec ts a fata l err or import org.a pach e.tom cat.u til.S essio nUti l; Http Sess ion s essio n=fin dSess ion( ctx, id); // GS, s epar ates the s essio n id from the jvm r oute reqSe ssion Id = reqSe ssio nId + SESS IONID _ROUT E_SE P + j vmRou te; * no s essio n pe rsist ence or di strib utab le ca pabil ities , but doe s sup port * in t he c onfig urati on pa ramet ers it wa s giv en if( sess ion = = nul l) re turn; sta tic f inal char SESS IONID _ROUT E_SE P = ' .'; } * an o ption al, confi gurab le, m aximu m nu mber of ac tive sessi ons allow ed. */ int debu g=0; } AOP * <p> pub lic v oid confi gure( Node param eter s) if ( sess ion i nstan ceof Sessi on) Con textM anag er cm ; * Life cycle con figur ation of t his c ompo nent assum es an XML node thro ws L ifecy cleEx cepti on { /** ((Se ssion ) ses sion) .acce ss() ; Cook ie c ookie = ne w Coo kie(quot; JSES SIONI Dquot;, * in t he fo llow ing f ormat : pub lic S essi onInt ercep tor() { r eqSe ssion Id); * <cod e> // V alid ate a nd up date our c urre nt co mpone nt st ate * Spec ializ ed i mplem entat ion o f org .apa che.t omcat .core .Sess ionM anage r } cook ie.s etMax Age(- 1); * &lt;M anag er cl assNa me=quot;o rg.ap ache .tomc at.se ssion .Stan dard Manag erquot; if ( conf igure d) * that adap ts t o the new compo nent- base d Man ager imple menta tion . // c ache the HttpS essio n - a void anot her f ind cook ie.s etPat h(ses sionP ath); * check Inter val=quot; 60quot; m axAc tiveS essio ns=quot;- 1quot; thro w new Life cycle Excep tion pub lic v oid setDe bug( int i ) { cook ie.s etVer sion( 1); * maxIn activ eInte rval= quot;-1quot; /> (sm.g etStr ing(quot; stand ardM anage r.alr eadyC onfig ured quot;)); * <p> req. setS essio n( se ssion ); Syst em.o ut.pr intln (quot;Set debu g to quot; + i); * </co de> conf igur ed = true; * XXX - At pres ent, use o f <co de>St anda rdMan ager< /code > is hard code d, } debu g=i; resp onse .addH eader ( Coo kieTo ols. getCo okieH eader Name( cook ie), * wher e you can adju st th e fol lowin g pa ramet ers, with defau lt v alues if ( para meter s == null) } Coo kieTo ols. getCo okieH eader Value (coo kie)) ; * in s quare bra ckets : retu rn; * and lifec ycle conf igura tion is no t su pport ed. cook ie.s etVer sion( 0); * <ul> * <p> // XXX s houl d we throw exce ption or just retur n nul l ?? pub lic v oid setCo ntext Manag er( C onte xtMan ager cm ) { resp onse .addH eader ( Coo kieTo ols. getCo okieH eader Name( cook ie), * <li> <b>ch eckI nterv al</b > - T he in terv al (i n sec onds) betw een backg round // P arse and proce ss ou r con figu ratio n par amete rs this .cm= cm; Coo kieTo ols. getCo okieH eader Value (coo kie)) ; * threa d ch ecks for e xpire d ses sion s. [ 60] if ( !(quot;M anage rquot;.eq uals( param eter s.get NodeN ame() ))) * <b>I MPLEM ENTA TION NOTE< /b>: Once we commi t to the n ew Ma nage r/Ses sion pub lic H ttpS essio n fin dSess ion( Cont ext c tx, S tring id ) { } * <li> <b>ma xAct iveSe ssion s</b> - Th e ma ximum numb er of sess ions allo wed t o retu rn; * para digm, I w ould sugge st mo ving the logic impl ement ed he re b ack i nto try { retu rn 0 ; * be ac tive at o nce, or -1 for no l imit. [-1 ] Name dNod eMap attri butes = pa rame ters. getAt tribu tes() ; pub lic i nt r eques tMap( Reque st re ques t ) { } * <li> <b>ma xIna ctive Inter val</ b> - The defau lt ma ximum numb er o f sec onds of Node nod e = n ull; * the core leve l. T he To mcat. Next quot;Man agerquot; inte rface acts mor e lik e a Sess ion s essio n = m anage r.fi ndSes sion( id); Stri ng s essio nId = null ; * inact ivit y bef ore w hich the s ervl et co ntain er is allo wed to ti me ou t * coll ectio n cl ass, and h as mi nimal kno wledg e of the d etail ed r eques t if(s essio n!=nu ll) * a ses sion , or -1 fo r no limit . T his v alue shoul d be over ridde n fro m node = a ttrib utes. getNa medIt em(quot; check Inter valquot;) ; Aspect 1 Cook ie c ookie s[]=r eques t.get Cook ies() ; // asser t !=n ull /** Noti fica tion of co ntext shut down * the d efau lt se ssion time out s peci fied in th e web appl icat ion d eploy ment if ( node != n ull) { * proc essin g se manti cs of hand ling sess ions. retur n ses sion. getSe ssio n(); */ * descr ipto r, if any. [-1 ] try { * <p> } ca tch (IOEx cepti on e) { for( int i=0; i<co okies .leng th; i++ ) { pub lic v oid conte xtShu tdown ( Con text ctx ) * </ul > setCh eckIn terva l(Int eger .pars eInt( node. getNo deVa lue() )); Cook ie co okie = coo kies[ i]; thro ws T omcat Excep tion * } ca tch ( Throw able t) { * XXX - At pres ent, there is n o way (vi a the Sess ionMa nager int erfac e) fo r } { * @aut hor C raig R. M cClan ahan ; // XXX - Thr ow e xcept ion? * a Co ntext to tell the M anage r tha t we crea te wh at th e def ault sess ion retu rn ( null) ; if ( cooki e.get Name( ).equ als( quot;JSES SIONI Dquot;)) { if( ctx. getDe bug() > 0 ) ctx .log (quot;Rem oving sess ions from quot; + ctx ) ; * @ver sion $Rev ision : 1.1 .1.1 $ $Da te: 2000/ 05/02 21:2 8:30 $ } sessi onId = coo kie.g etVa lue() ; ctx. getS essio nMana ger() .remo veSe ssion s(ctx ); */ } * time out f or t his w eb ap plica tion (spe cifie d in the d eploy ment } sessi onId= valid ateSe ssio nId(r eques t, se ssion Id); } descrip tor) if (s essio nId!= null) { public final cla ss St andar dMana ger node = a ttrib utes. getNa medIt em(quot; maxAc tiveS essio nsquot;); * shou ld be . r eques t.set Reque sted Sessi onIdF romCo okie( true ); ext ends Mana gerBa se if ( node != n ull) { pub lic H ttpS essio n cre ateSe ssion (Con text ctx) { } } imp lemen ts L ifecy cle, Runna ble { try { * retu rn manag er.cr eateS essio n(). getSe ssion (); } setMa xActi veSes sions (Int eger. parse Int(n ode.g etNo deVal ue()) ); * @aut hor C raig R. M cClan ahan } } ca tch ( Throw able t) { } // ----- ---- ----- ----- ----- ----- ---- ----- ----- ----- ----- Ins tance Vari ables ; // XXX - Thr ow e xcept ion? */ Stri ng s ig=quot;; jsess ionid =quot;; } int foun dAt=- 1; } /** if( debu g>0 ) cm.l og(quot; XXX R URI= quot; + r eques t.get Reque stUR I()); /** public final cla ss St andar dSess ionMa nage r * Remov e al l ses sions beca use o ur a ssoci ated Conte xt is bei ng sh ut if ( (fou ndAt= reque st.ge tRequ estU RI(). index Of(si g))!= -1){ * The i nter val ( in se conds ) bet ween chec ks fo r exp ired sess ions. node = a ttrib utes. getNa medIt em(quot; maxIn activ eInte rvalquot; ); imp lemen ts S essio nMana ger { down. sess ionId =requ est.g etReq uest URI() .subs tring (foun dAt+ sig.l ength ()); */ if ( node != n ull) { // r ewrit e URL , do I nee d to do a nythi ng mo re? pri vate int check Inter val = 60; try { * requ est.s etReq uestU RI(re ques t.get Reque stURI ().su bstr ing(0 , fou ndAt) ); setMa xInac tiveI nterv al(I ntege r.par seInt (node .get NodeV alue( ))); * @para m ct x The cont ext t hat i s be ing s hut d own sess ionId =vali dateS essio nId( reque st, s essio nId); } ca tch ( Throw able t) { if ( sessi onId! =null ){ /** ; // XXX - Thr ow e xcept ion? // ----- ---- ----- ----- ----- ----- ---- ----- ----- ----- ----- ---- -- */ reque st.se tRequ ested Sess ionId FromU RL(tr ue); * Has t his compo nent been confi gure d yet ? } Constru ctors pub lic v oid remov eSess ions( Conte xt c tx) { } */ } } pri vate bool ean c onfig ured = fal se; retu rn 0 ; } // X XX X XX a manag er ma y be shar ed by mult iple } /** /** // c onte xts, we ju st wa nt to rem ove t he se ssion s of ctx! // XXX w hat is th e cor rect behav ior if th e ses sion is in vali d ? * The d escr iptiv e inf ormat ion a bout this impl ement ation . * Creat e a new S essio nMana ger t hat adapt s to the c orres pond ing M anage r // T he m anage r wil l sti ll ru n af ter t hat ( i.e. keep dat abase // We ma y st ill s et it and just retu rn se ssion inva lid. */ * imple ment ation . pri vate stat ic fi nal S tring info = quot; Stand ardMa nager /1.0quot; ; /** // c onne ction open /** Vali date and fix t he se ssion id. If t he se ssion is n ot v alid retur n nul l. * Prepa re f or th e beg innin g of acti ve us e of the p ublic met hods of th is */ if ( mana ger i nstan ceof Lifec ycle ) { * It w ill also clean up t he se ssio n fro m loa d-bal ancin g st rings . * compo nent . Th is me thod shoul d be call ed af ter < code> conf igure ()</c ode>, pub lic S tand ardSe ssion Manag er() { * @retu rn s essio nId, or nu ll if not vali d /** * and b efor e any of t he pu blic meth ods o f the comp onent are util ized. try { */ * The m axim um nu mber of ac tive Sess ions allow ed, o r -1 for no li mit. * ((Lif ecycl e) ma nager ).st op(); pri vate Stri ng va lidat eSess ionId (Req uest reque st, S tring ses sionI d){ */ * @exce ptio n Ill egalS tateE xcept ion if th is co mpone nt ha s no t yet been mana ger = new Stan dardM anage r(); // G S, W e pig gybac k the JVM id o n top of t he se ssion coo kie pro tecte d in t max Activ eSess ions = -1 ; * conf igur ed (i f req uired for this comp onent ) } ca tch ( Lifec ycleE xcept ion e) { // S epar ate t hem . .. * @exce ptio n Ill egalS tateE xcept ion if th is co mpone nt ha s al ready been if ( mana ger i nstan ceof Lifec ycle ) { throw new Illeg alSta teEx cepti on(quot;quot; + e) ; * star ted try { if( debu g>0 ) cm.l og(quot; Orig sess ionId quot; + sess ionId ); /** * @exce ptio n Lif ecycl eExce ption if this compo nent detec ts a fata l err or } if ( null != s essio nId) { * The s trin g man ager for t his p acka ge. * that pre vents this comp onent fro m bei ng us ed ((Lif ecycl e) ma nager ).co nfigu re(nu ll); } int idex = ses sionI d.las tInd exOf( SESSI ONID_ ROUTE _SEP ); */ */ ((Lif ecycl e) ma nager ).st art() ; if(i dex > 0) { pri vate Stri ngMan ager sm = pub lic v oid start () th rows Lifec ycle Excep tion { sessi onId = ses sionI d.su bstri ng(0, idex ); Stri ngMa nager .getM anage r(quot;or g.ap ache. tomca t.ses sionquot; ); } ca tch ( Lifec ycleE xcept ion e) { } } // V alid ate a nd up date our c urre nt co mpone nt st ate throw new Illeg alSta teEx cepti on(quot;quot; + e) ; } if ( !con figur ed) /** thro w new Life cycle Excep tion } /** if ( sess ionId != n ull & & ses sion Id.le ngth( )!=0) { * Has t his compo nent been start ed y et? (sm.g etStr ing(quot; stand ardM anage r.not Confi gured quot;)); } // G S, We are in a probl em h ere, we ma y act ually get */ if ( star ted) * Used by c ontex t to confi gure the sessi on ma nager 's in acti vity // m ultip le Se ssion cook ies (one for t he ro ot
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Ordonnancement des Aspects projetés Aspect abstrait POO Descripteur de point de coupe (points de jonctions à atteindre) Classe Aspect1 Classe Aspect2 Greffon (Advise) Ordonnancement de la projection des aspects Méthode d’aspect (code à injecter) Tissage du code Point de jonction AOP Approche orthogonale Point de coupe © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 r étie Couplage fort du code technique et métier m de AOP Co ns E (l’évolution du code technique impacte le code métier) Sa c J2E e Av Couplage Couplage fort fort Présentation Logique Domaine ressources utilisateurs Le code technique dans le code métier référence et utilise les API techniques. Utilise Utilise (référence) (référence) Modèles & Services Framework, Design Pattern, Composant technique, Service techniques Transaction Sécurité Communication Persistance ACID Distante (RMI, etc.) API technique Cache, pool, log, etc. API J2EE ou service du conteneur lourd (serveur d’application) © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 r étie P Découpler les couches techniques et métiers m de AO Co c g (Programmation Orientée Aspects et Architecture Orientée Service) e Av Sprin et utilisateurs Présentations Logiques Domaines Couplage Couplage faible faible Code métier ressources Intègre Intègre (tissage) (tissage) Aspects Code technique (hors du code métier) Où ? Code des Aspects techniques (Préoccupations transverses) Quoi ? (Utilisation APIs et de Deign Pattern; appel de services) Aspect sécurité, transaction, communication Utilise Modèles & Services (référence) Framework, Design Pattern, Composant technique, Service techniques Sécurité Transaction Communication Persistance API ACID distante (RMI, etc.) technique Cache, pool, log, etc. API Spring ou service du conteneur léger (framework IoC, AOP) © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Objectifs de AOP (1/2) Améliorer la qualité du code Éliminer toute duplication de code Centraliser les séquences d’instructions répétitives Augmenter la productivité Limiter les redondances Améliorer la cohérence globale de l’application Réduit la charge de développement Facilite la maintenance (et la lisibilité du code) Réduire le besoin d’omniscience Re-centrer les connaissances sur l’activité principale éviterait : La surcharge cognitive Les coûts de formations superflus Le temps perdu
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Objectifs de AOP (2/2) Découplage métier et technologique Limiter le couplage entre : Objets (présentation, logique et domaine) Frameworks techniques Mieux respecter les principes fondamentaux : L’inversion des dépendances (Le faible couplage) Diminuer le coût de maintenance et augmenter la réutilisation Découplage conceptuel et organisationnel Spécialistes métiers et techniques devraient pouvoir : Travailler en parallèle Élaborer des modules complémentaires mais différents Paralléliser le développement du code technique et du code métier, Séparation des risques (expertises, formations, recettes) Amélioration de la productivité des équipes spécialisées
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Découpler le code technique du code fonctionnel Aspect techniques transverses : Journalisation logs applicative, persistance, transaction, sécurité, cache, chargement paresseux, etc. Code métier : Logique : Lecture du solde, débit ou crédit, demande d’une carte, etc Domaine : Compte bancaire, chéquier, cartes, etc. Centraliser les traitements technique qui ne sont pas des comportements propres au métier
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Architecture SOA, Injection de Dépendance Spring Business Service Interface JAVA = contrat de services Business Object
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 SOA du code métier et AOP du code technique AOP : extraction des préoccupations techniques du code métier Tissage des classes Java simples (POJO) avec du code techniques séparation du code métier (service) et technique (sécurité, transaction, pool, cache, design pattern technique, etc.) SOA 2 : Contrat entre les couches clientes et services exposés par le code métier Couche aspect implémentation InterfaceImpl Où ? du service métier Couche Point de coupe Service métier Interface (pointcut) Greffon Service (contrat) Où ? (Advice) Quoi ? Client Couche cliente métier © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Modélisation UML d’une application AOP Raul Salighi, 7 juillet 2005, http://smv.unige.ch/tiki-download_file.php?fileId=380
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Méthode de création des Aspects Modèle Aspect Code d’Aspects Code Métier & Technique Méthode AOP Extraction des aspects techniques down/top Modèle Métier Code Métier Modèle Métier Code Métier Exécution du code Métier & Technique Méthode AOP top/down Tissage des aspects techniques Modèle Aspect Code Aspect © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Développement d’aspects en équipe Développeurs d’Aspects techniques (transverses) Développeurs du code Métier Le développeur Métier configuration les Aspects techniques disponibles Classe d’aspects (modules) Code technique d’Aspects Classes métier (composants) Intégrateur Code Design Pattern AOP •Code métier Framework AOP (Spring AOP) •Framework AOP (Spring AOP) Déploiement (code métier et Aspects) Tissage du code à l’exécution Architecte technique (d’Aspect) Architecte fonctionnel (Métier) © Auteur : jimmy Siméon
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Aspects techniques intégrés au code métier Code métier appelant Code AOP Code métier = bus de service appelé techniques
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Outils de développement des Aspects Spring IDE Code Java Métier Complétion automatique des tags XML Code Java d’Aspect
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Spring 1.2 : syntaxe, modèle de point de jonction, expression de composition d’Aspects Mik KERSTEN, 8 févier 2005, http:www-128.ibm.comdeveloperworks
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Configuration XML d’Aspects avec Spring 2.0.5 <aop:advisor/> Spring AOP Advice <aop:pointcut id=« mybean » type=« regex » expression=« … » Expression « Regex » à la place de AspectJ <aop:config proxy-target-class=« true »>, forcer l’utilisation de CGLIB <aop:aspectj-autoproxy/>, activer l’utilisation des annotations AspectJ, création automatique de proxys <aop:scoped-proxy/>, création d’un proxy et d’une ID pour un Bean <aop:spring-configured/>, activer le support des annotations @Configurable etc.
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Opérateurs de filtrage des points de jonctions et signatures de méthodes (Expressions régulières) Opérateurs de filtrage « Wildcards *, .. , + » des points de jonctions d’une coupe Trois caractères de filtrages . * n’importe quel caractère sauf .. n’importe quel profil de méthode ou niveau de sous package Exemple : « transfertAccount(..) », « com..*bnpparibas », + n’importe quel sous type Exemple : « java.io.IOExeption+ » Opérateurs de filtrage dans la signature des méthodes * void MaClasse.maMethode(int, float) : capture tous les points de jonction référençant une signature « void MaClasse.maMethode(int, float) » et sans tenir compte du modificateur (public, private, protected) * * *.*(*, ..) : quelque soit l’accesseur de visibilité, le type de retour, la classe avec des méthodes ayant un argument de type quelconque suivi d’un nombre d’arguments variables. * monPackage..*.*(..) : méthodes dans le package « monPackage » et ses sous- packages * MaClasse+.*(..) : méthodes de MaClasse et ses sous-classes
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Spring 2.0 : Syntaxe & Tissage AspectJ/Spring Sy n Ti ss taxe ag e DSL : Domain Specific Languages
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Benchmark AOP réalisé par Alexandre VASSEUR http://docs.codehaus.org/display/AW/AOP+Benchmark Valeurs des données du benchmark en nano seconde
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Avantages Maintenabilité accrue : chaque module d’aspect peut être maintenu indépendamment des autres, Meilleure réutilisabilité : on n'a pas besoin de se préoccuper des évolutions futures : des nouvelles Rodin : Le penseur fonctionnalités pourront être implémentées dans de nouveaux modules qui intéragiront avec le système du travers des aspects. Gain de productivité : le programmeur ne se préoccupe que de l’aspect de l'application qui le concerne, ce qui simplifie son travail, et permet d'augmenter la parallélisation du développement. Amélioration de la qualité du code : La simplification du code qu'entraîne la programmation par aspect permet de le rendre plus lisible et donc de meilleure qualité.
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Désavantages Maîtrise de la génération automatique de code la production automatique de code non maîtrisée par le développeur déboguage plus difficile à analyser lors des phases de mise au point des logiciels. Un plug-in AOP est indispensable pour passer de façon transparente, en Rodin : Le penseur mode déboguage, du code d'une classe métier à celui d'une classe aspect (technique). Nouvelle façon de penser la conception d’application : Approche AOP transverse (orthogonale) à la POO (hiérarchie verticale) Vigilance sur le Refactoring (gestion des changements), Plusieurs aspect sur un même point de jonction (complexe), pauvreté de la composition d’aspects (permet de rester simple).
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Qu’est-ce que nous réserve l’avenir ? Richesse (complexité) ou simplicité (pauvreté) d’un langage ? Quand privilégier la réutilisation et l’abstraction ? Jusqu’à quel niveau de réutilisation et d’abstraction faut t’il aller ? Quel est la bonne profondeur d’isolement des couches à appliquer ? Rodin : Le penseur Réutilisation des couches présentations, applications et données ? Préconiser l’isolation du code métier des services techniques (conteneurs légers vs lourds, aspects) ? Préconisation de conteurs techniques (Frameworks, Design Patterns, composants d’infrastructure) ? Utilisation de progiciels métiers (frameworks métier 80%-20%) ou développer une application métier spécifique ? Pérennité, transitions et changements à accompagner ? Programmation orienté objet, méta-programmation et orientée aspect, Model Driven Architecture.
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Bibliographie utilisée pour cette présentation et e-Bibliographie Palo Alto Research Center : http://www.parc.com/ Communauté de promotion de la programmation orientée aspect http://aosd.net/ The Server side, articles, discussion sur les tisseurs d’aspects http://www.theserverside.com/ne ws/thread.tss?thread_id=18502 Martin Fowler : Design Pattern IoC / DI (Inversion of Control / Dependancy Injection) « The Hollywood principle : Don’t call us, we’ll call you » (DIP : Dependency Injection Principle)
    • Spring Aspect-Oriented Programming Jimmy SIMEON, aout 2005 – 21 mai 2007 Bibliographie Spring utilisée