Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Spring AOP ʹÓýéÉÜ£¬´ÓǰÊÀµ½½ñÉú
 
  2937  次浏览      27
 2019-8-26
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚjianshu£¬±¾ÎÄÖ÷Òª½éÉÜÁËSpring AOP ·¢Õ¹µ½ÏÖÔÚ³öÏÖµÄÈ«²¿ 3 ÖÖÅäÖ÷½Ê½£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£

Spring AOP ·¢Õ¹µ½ÏÖÔÚ³öÏÖµÄÈ«²¿ 3 ÖÖÅäÖ÷½Ê½¡£

ÓÉÓÚ Spring Ç¿´óµÄÏòºó¼æÈÝÐÔ£¬Êµ¼Ê´úÂëÖÐÍùÍù»á³öÏֺܶàÅäÖûìÔÓµÄÇé¿ö£¬¶øÇÒ¾ÓÈ»»¹Äܹ¤×÷£¬±¾ÎÄÏ£Íû°ïÖú´ó¼ÒÀíÇå³þÕâЩ֪ʶ¡£

AOP, AspectJ, Spring AOP

ÎÒÃÇÏÈÀ´°ÑËüÃǵĸÅÄîºÍ¹ØÏµËµËµÇå³þ¡£

AOP ҪʵÏÖµÄÊÇÔÚÎÒÃÇÔ­À´Ð´µÄ´úÂëµÄ»ù´¡ÉÏ£¬½øÐÐÒ»¶¨µÄ°ü×°£¬ÈçÔÚ·½·¨Ö´ÐÐǰ¡¢·½·¨·µ»Øºó¡¢·½·¨Å׳öÒì³£ºóµÈµØ·½½øÐÐÒ»¶¨µÄÀ¹½Ø´¦Àí»òÕß½ÐÔöÇ¿´¦Àí¡£

AOP µÄʵÏÖ²¢²»ÊÇÒòΪ Java ÌṩÁËʲôÉñÆæµÄ¹³×Ó£¬¿ÉÒÔ°Ñ·½·¨µÄ¼¸¸öÉúÃüÖÜÆÚ¸æËßÎÒÃÇ£¬¶øÊÇÎÒÃÇҪʵÏÖÒ»¸ö´úÀí£¬Êµ¼ÊÔËÐеÄʵÀýÆäʵÊÇÉú³ÉµÄ´úÀíÀàµÄʵÀý¡£

×÷Ϊ Java ¿ª·¢Õߣ¬ÎÒÃǶ¼ºÜÊìϤ AspectJ Õâ¸ö´Ê£¬ÉõÖÁÓÚÎÒÃÇÌáµ½ AOP µÄʱºò£¬Ïëµ½µÄÍùÍù¾ÍÊÇ AspectJ£¬¼´Ê¹Äã¿ÉÄܲ»Ì«¶®ËüÊÇÔõô¹¤×÷µÄ¡£ÕâÀÎÒÃÇ°Ñ AspectJ ºÍ Spring AOP ×ö¸ö¼òµ¥µÄ¶Ô±È£º

Spring AOP£º

Ëü»ùÓÚ¶¯Ì¬´úÀíÀ´ÊµÏÖ¡£Ä¬Èϵأ¬Èç¹ûʹÓýӿڵģ¬Óà JDK ÌṩµÄ¶¯Ì¬´úÀíʵÏÖ£¬Èç¹ûûÓнӿڣ¬Ê¹Óà CGLIB ʵÏÖ¡£´ó¼ÒÒ»¶¨ÒªÃ÷°×±³ºóµÄÒâ˼£¬°üÀ¨Ê²Ã´Ê±ºò»á²»Óà JDK ÌṩµÄ¶¯Ì¬´úÀí£¬¶øÓà CGLIB ʵÏÖ¡£

Spring 3.2 ÒÔºó£¬spring-core Ö±½Ó¾Í°Ñ CGLIB ºÍ ASM µÄÔ´Âë°üÀ¨½øÀ´ÁË£¬ÕâÒ²ÊÇΪʲôÎÒÃDz»ÐèÒªÏÔʽÒýÈëÕâÁ½¸öÒÀÀµ

Spring µÄ IOC ÈÝÆ÷ºÍ AOP ¶¼ºÜÖØÒª£¬Spring AOP ÐèÒªÒÀÀµÓÚ IOC ÈÝÆ÷À´¹ÜÀí¡£

Èç¹ûÄãÊÇ web ¿ª·¢Õߣ¬ÓÐЩʱºò£¬Äã¿ÉÄÜÐèÒªµÄÊÇÒ»¸ö Filter »òÒ»¸ö Interceptor£¬¶ø²»Ò»¶¨ÊÇ AOP¡£

Spring AOP Ö»ÄÜ×÷ÓÃÓÚ Spring ÈÝÆ÷ÖÐµÄ Bean£¬ËüÊÇʹÓô¿´âµÄ Java ´úÂëʵÏֵģ¬Ö»ÄÜ×÷ÓÃÓÚ bean µÄ·½·¨¡£

Spring ÌṩÁË AspectJ µÄÖ§³Ö£¬ºóÃæÎÒÃǻᵥ¶À½éÉÜÔõôʹÓã¬Ò»°ãÀ´ËµÎÒÃÇÓô¿µÄ Spring AOP ¾Í¹»ÁË¡£

ºÜ¶àÈË»á¶Ô±È Spring AOP ºÍ AspectJ µÄÐÔÄÜ£¬Spring AOP ÊÇ»ùÓÚ´úÀíʵÏֵģ¬ÔÚÈÝÆ÷Æô¶¯µÄʱºòÐèÒªÉú³É´úÀíʵÀý£¬ÔÚ·½·¨µ÷ÓÃÉÏÒ²»áÔö¼ÓÕ»µÄÉî¶È£¬Ê¹µÃ Spring AOP µÄÐÔÄܲ»Èç AspectJ ÄÇôºÃ¡£

AspectJ£º

AspectJ ³öÉíÒ²ÊÇÃûÃÅ£¬À´×ÔÓÚ Eclipse »ù½ð»á£¬link£ºhttps://www.eclipse.org/aspectj

ÊôÓÚ¾²Ì¬Ö¯È룬ËüÊÇͨ¹ýÐ޸ĴúÂëÀ´ÊµÏֵģ¬ËüµÄÖ¯Èëʱ»ú¿ÉÒÔÊÇ£º

Compile-time weaving£º±àÒëÆÚÖ¯È룬ÈçÀà A ʹÓà AspectJ Ìí¼ÓÁËÒ»¸öÊôÐÔ£¬Àà B ÒýÓÃÁËËü£¬Õâ¸ö³¡¾°¾ÍÐèÒª±àÒëÆÚµÄʱºò¾Í½øÐÐÖ¯È룬·ñÔòû·¨±àÒëÀà B¡£

Post-compile weaving£ºÒ²¾ÍÊÇÒѾ­Éú³ÉÁË .class Îļþ£¬»òÒѾ­´ò³É jar °üÁË£¬ÕâÖÖÇé¿öÎÒÃÇÐèÒªÔöÇ¿´¦ÀíµÄ»°£¬¾ÍÒªÓõ½±àÒëºóÖ¯Èë¡£

Load-time weaving£ºÖ¸µÄÊÇÔÚ¼ÓÔØÀàµÄʱºò½øÐÐÖ¯È룬ҪʵÏÖÕâ¸öʱÆÚµÄÖ¯È룬Óм¸ÖÖ³£¼ûµÄ·½·¨¡£1¡¢×Ô¶¨ÒåÀà¼ÓÔØÆ÷À´¸ÉÕâ¸ö£¬Õâ¸öÓ¦¸ÃÊÇ×îÈÝÒ×Ïëµ½µÄ°ì·¨£¬ÔÚ±»Ö¯ÈëÀà¼ÓÔØµ½ JVM ǰȥ¶ÔËü½øÐмÓÔØ£¬ÕâÑù¾Í¿ÉÒÔÔÚ¼ÓÔØµÄʱºò¶¨ÒåÐÐΪÁË¡£2¡¢ÔÚ JVM Æô¶¯µÄʱºòÖ¸¶¨ AspectJ ÌṩµÄ agent£º-javaagent:xxx/xxx/aspectjweaver.jar¡£AspectJ Äܸɺܶà Spring AOP ¸É²»Á˵ÄÊÂÇ飬ËüÊÇ AOP ±à³ÌµÄÍêÈ«½â¾ö·½°¸¡£Spring AOP ÖÂÁ¦ÓÚ½â¾öµÄÊÇÆóÒµ¼¶¿ª·¢ÖÐ×îÆÕ±éµÄ AOP ÐèÇ󣨷½·¨Ö¯È룩£¬¶ø²»ÊÇÁ¦Çó³ÉΪһ¸öÏñ AspectJ Ò»ÑùµÄ AOP ±à³ÌÍêÈ«½â¾ö·½°¸¡£

ÒòΪ AspectJ ÔÚʵ¼Ê´úÂëÔËÐÐǰÍê³ÉÁËÖ¯È룬ËùÒÔ´ó¼Ò»á˵ËüÉú³ÉµÄÀàÊÇûÓжîÍâÔËÐÐʱ¿ªÏúµÄ¡£

AOP ÊõÓï½âÊÍ

ÔÚÕâÀ²»×¼±¸½âÊÍÄÇô¶à AOP ±à³ÌÖеÄÊõÓïÁË£¬ÎÒÃÇÅöµ½Ò»¸ö˵һ¸ö°É¡£

Advice¡¢Advisor¡¢Pointcut¡¢Aspect¡¢Joinpoint µÈµÈ¡£

Spring AOP

Ê×ÏÈҪ˵Ã÷µÄÊÇ£¬ÕâÀï½éÉÜµÄ Spring AOP ÊÇ´¿µÄ Spring ´úÂ룬ºÍ AspectJ ûʲô¹ØÏµ£¬µ«ÊÇ Spring ÑÓÓÃÁË AspectJ ÖеĸÅÄ°üÀ¨Ê¹ÓÃÁË AspectJ ÌṩµÄ jar °üÖеÄ×¢½â£¬µ«ÊDz»ÒÀÀµÓÚÆäʵÏÖ¹¦ÄÜ¡£

ºóÃæ½éÉܵÄÈç @Aspect¡¢@Pointcut¡¢@Before¡¢@After µÈ×¢½â¶¼ÊÇÀ´×ÔÓÚ AspectJ£¬µ«Êǹ¦ÄܵÄʵÏÖÊÇ´¿ Spring AOP ×Ô¼ºÊµÏֵġ£

ÏÂÃæÎÒÃÇÀ´½éÉÜ Spring AOP µÄʹÓ÷½·¨£¬ÏÈ´Ó×î¼òµ¥µÄÅäÖ÷½Ê½¿ªÊ¼ËµÆð£¬ÕâÑù¶ÁÕßÏë¿´Ô´ÂëÒ²»á±È½ÏÈÝÒס£

Ŀǰ Spring AOP Ò»¹²ÓÐÈýÖÖÅäÖ÷½Ê½£¬Spring ×öµ½Á˺ܺõØÏòϼæÈÝ£¬ËùÒÔ´ó¼Ò¿ÉÒÔ·ÅÐÄʹÓá£

Spring 1.2 »ùÓÚ½Ó¿ÚµÄÅäÖãº×îÔçµÄ Spring AOP ÊÇÍêÈ«»ùÓÚ¼¸¸ö½Ó¿ÚµÄ£¬Ïë¿´Ô´ÂëµÄͬѧ¿ÉÒÔ´ÓÕâÀïÆð²½¡£

Spring 2.0 @AspectJ ÅäÖãºÊ¹ÓÃ×¢½âµÄ·½Ê½À´ÅäÖã¬ÕâÖÖ·½Ê½¸Ð¾õÊÇ×î·½±ãµÄ£¬»¹ÓУ¬ÕâÀïËäÈ»½Ð×ö @AspectJ£¬µ«ÊÇÕâ¸öºÍ AspectJ Æäʵûɶ¹ØÏµ¡£

Spring 2.0 schema-based ÅäÖãºSpring 2.0 ÒÔºóʹÓà XML µÄ·½Ê½À´ÅäÖã¬Ê¹Óà ÃüÃû¿Õ¼ä <aop />

Spring 1.2 ÖеÄÅäÖÃ

Õâ½ÚÎÒÃǽ«½éÉÜ Spring 1.2 ÖеÄÅäÖã¬ÕâÊÇ×î¹ÅÀϵÄÅäÖ㬵«ÊÇÓÉÓÚ Spring ÌṩÁ˺ܺõÄÏòºó¼æÈÝ£¬ÒÔ¼°ºÜ¶àÈ˸ù±¾²»ÖªµÀʲôÅäÖÃÊÇʲô°æ±¾µÄ£¬ÒÔ¼°ÊÇ·ñÓиüиüºÃµÄÅäÖ÷½·¨Ìæ´ú£¬ËùÒÔ»¹ÊÇ»áÓкܶà´úÂëÊDzÉÓÃÕâÖÖ¹ÅÀϵÄÅäÖ÷½Ê½µÄ£¬ÕâÀï˵µÄ¹ÅÀϲ¢Ã»ÓбáÒåµÄÒâ˼¡£

ÏÂÃæÓÃÒ»¸ö¼òµ¥µÄÀý×ÓÀ´ÑÝʾÔõôʹÓà Spring 1.2 µÄÅäÖ÷½Ê½¡£

Ê×ÏÈ£¬ÎÒÃÇÏȶ¨ÒåÁ½¸ö½Ó¿Ú UserService ºÍ OrderService£¬ÒÔ¼°ËüÃǵÄʵÏÖÀà UserServiceImpl ºÍ OrderServiceImpl£º

½ÓÏÂÀ´£¬ÎÒÃǶ¨ÒåÁ½¸ö advice£¬·Ö±ðÓÃÓÚÀ¹½Ø·½·¨Ö´ÐÐǰºÍ·½·¨·µ»Øºó£º

advice ÊÇÎÒÃǽӴ¥µÄµÚÒ»¸ö¸ÅÄ¼ÇסËüÊǸÉʲôÓõġ£

ÉÏÃæµÄÁ½¸ö Advice ·Ö±ðÓÃÓÚ·½·¨µ÷ÓÃǰÊä³ö²ÎÊýºÍ·½·¨µ÷ÓúóÊä³ö½á¹û¡£

ÏÖÔÚ¿ÉÒÔ¿ªÊ¼ÅäÖÃÁË£¬ÎÒÃÇÅäÖÃÒ»¸öÃûΪ spring_1_2.xml µÄÎļþ£º

½ÓÏÂÀ´£¬ÎÒÃÇÅÜÆðÀ´¿´¿´£º

²é¿´Êä³ö½á¹û£º

×¼±¸Ö´Ðз½·¨: createUser, ²ÎÊýÁÐ±í£º[Tom, Cruise, 55]

·½·¨·µ»Ø£ºUser{firstName='Tom', lastName='Cruise', age=55, address='null'}

×¼±¸Ö´Ðз½·¨: queryUser, ²ÎÊýÁÐ±í£º[]

·½·¨·µ»Ø£ºUser{firstName='Tom', lastName='Cruise', age=55, address='null'}

´Ó½á¹û¿ÉÒÔ¿´µ½£¬¶Ô UserService ÖеÄÁ½¸ö·½·¨¶¼×öÁËǰ¡¢ºóÀ¹½Ø¡£Õâ¸öÀý×ÓÀí½âÆðÀ´Ó¦¸Ã·Ç³£¼òµ¥£¬¾ÍÊÇÒ»¸ö´úÀíʵÏÖ¡£

´úÀíģʽÐèÒªÒ»¸ö½Ó¿Ú¡¢Ò»¸ö¾ßÌåʵÏÖÀ࣬Ȼºó¾ÍÊǶ¨ÒåÒ»¸ö´úÀíÀ࣬ÓÃÀ´°üװʵÏÖÀ࣬Ìí¼Ó×Ô¶¨ÒåÂß¼­£¬ÔÚʹÓõÄʱºò£¬ÐèÒªÓôúÀíÀàÀ´Éú³ÉʵÀý¡£

´ËÖз½·¨ÓиöÖÂÃüµÄÎÊÌ⣬Èç¹ûÎÒÃÇÐèÒªÀ¹½Ø OrderService Öеķ½·¨£¬ÄÇôÎÒÃÇ»¹ÐèÒª¶¨ÒåÒ»¸ö OrderService µÄ´úÀí¡£Èç¹û»¹ÒªÀ¹½Ø PostService£¬µÃ¶¨ÒåÒ»¸ö PostService µÄ´úÀí......

¶øÇÒ£¬ÎÒÃÇ¿´µ½£¬ÎÒÃǵÄÀ¹½ØÆ÷µÄÁ£¶ÈÖ»¿ØÖƵ½ÁËÀ༶±ð£¬ÀàÖÐËùÓеķ½·¨¶¼½øÐÐÁËÀ¹½Ø¡£½ÓÏÂÀ´£¬ÎÒÃÇ¿´¿´ÔõôÑùÖ»À¹½ØÌض¨µÄ·½·¨¡£

ÔÚÉÏÃæµÄÅäÖÃÖУ¬ÅäÖÃÀ¹½ØÆ÷µÄʱºò£¬interceptorNames ³ýÁËÖ¸¶¨Îª Advice£¬ÊÇ»¹¿ÉÒÔÖ¸¶¨Îª Interceptor ºÍ Advisor µÄ¡£

ÕâÀïÎÒÃÇÀ´Àí½â Advisor µÄ¸ÅÄËüÒ²±È½Ï¼òµ¥£¬ËüÄÚ²¿ÐèÒªÖ¸¶¨Ò»¸ö Advice£¬Advisor ¾ö¶¨¸ÃÀ¹½ØÄÄЩ·½·¨£¬À¹½ØºóÐèÒªÍê³ÉµÄ¹¤×÷»¹ÊÇÄÚ²¿µÄ Advice À´×ö¡£

ËüÓкü¸¸öʵÏÖÀ࣬ÕâÀïÎÒÃÇʹÓÃʵÏÖÀà NameMatchMethodPointcutAdvisor À´ÑÝʾ£¬´ÓÃû×ÖÉϾͿÉÒÔ¿´³öÀ´£¬ËüÐèÒªÎÒÃǸøËüÌṩ·½·¨Ãû×Ö£¬ÕâÑù·ûºÏ¸ÃÅäÖõķ½·¨²Å»á×öÀ¹½Ø¡£

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬userServiceProxy Õâ¸ö bean ÅäÖÃÁËÒ»¸ö advisor£¬advisor ÄÚ²¿ÓÐÒ»¸ö advice¡£advisor ¸ºÔðÆ¥Åä·½·¨£¬ÄÚ²¿µÄ advice ¸ºÔðʵÏÖ·½·¨°ü×°¡£

×¢Ò⣬ÕâÀïµÄ mappedNames ÅäÖÃÊÇ¿ÉÒÔÖ¸¶¨¶à¸öµÄ£¬ÓöººÅ·Ö¸ô£¬¿ÉÒÔÊDz»Í¬ÀàÖеķ½·¨¡£Ïà±ÈÖ±½ÓÖ¸¶¨ advice£¬advisor ʵÏÖÁ˸üϸÁ£¶ÈµÄ¿ØÖÆ£¬ÒòΪÔÚÕâÀïÅäÖà advice µÄ»°£¬ËùÓз½·¨¶¼»á±»À¹½Ø¡£

Êä³ö½á¹ûÈçÏ£¬Ö»ÓÐ createUser ·½·¨±»À¹½Ø£º

×¼±¸Ö´Ðз½·¨: createUser, ²ÎÊýÁÐ±í£º[Tom, Cruise, 55]

µ½ÕâÀÎÒÃÇÒѾ­Á˽âÁË Advice ºÍ Advisor ÁË£¬Ç°ÃæÒ²ËµÁË»¹¿ÉÒÔÅäÖà Interceptor¡£

¶ÔÓÚ Java ¿ª·¢ÕßÀ´Ëµ£¬¶Ô Interceptor Õâ¸ö¸ÅÄî¿Ï¶¨¶¼ºÜÊìϤÁË£¬ÕâÀï¾Í²»×öÑÝʾÁË£¬ÌùÒ»ÏÂʵÏÖ´úÂ룺

public class DebugInterceptor implements MethodInterceptor {

public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before: invocation=[" + invocation + "]");
// Ö´ÐÐ ÕæÊµÊµÏÖÀà µÄ·½·¨
Object rval = invocation.proceed();
System.out.println("Invocation returned");
return rval;
}
}

ÉÏÃæ£¬ÎÒÃǽéÉÜÍêÁË Advice¡¢Advisor¡¢Interceptor Èý¸ö¸ÅÄÏàÐÅ´ó¼ÒÓ¦¸ÃºÜÈÝÒ׾Ϳ´¶®ËüÃÇÁË¡£

ËüÃÇÓиö¹²Í¬µÄÎÊÌ⣬ÄǾÍÊÇÎÒÃǵÃΪÿ¸ö bean ¶¼ÅäÖÃÒ»¸ö´úÀí£¬Ö®ºó»ñÈ¡ bean µÄʱºòÐèÒª»ñÈ¡Õâ¸ö´úÀíÀàµÄ bean ʵÀý£¨Èç (UserService) context.getBean("userServiceProxy")£©£¬ÕâÏÔÈ»·Ç³£²»·½±ã£¬²»ÀûÓÚÎÒÃÇÖ®ºóҪʹÓõÄ×Ô¶¯¸ù¾ÝÀàÐÍ×¢Èë¡£ÏÂÃæ½éÉÜ autoproxy µÄ½â¾ö·½°¸¡£

autoproxy£º´ÓÃû×ÖÎÒÃÇÒ²¿ÉÒÔ¿´³öÀ´£¬ËüÊÇʵÏÖ×Ô¶¯´úÀí£¬Ò²¾ÍÊÇ˵µ± Spring ·¢ÏÖÒ»¸ö bean ÐèÒª±»ÇÐÃæÖ¯ÈëµÄʱºò£¬Spring »á×Ô¶¯Éú³ÉÕâ¸ö bean µÄÒ»¸ö´úÀíÀ´À¹½Ø·½·¨µÄÖ´ÐУ¬È·±£¶¨ÒåµÄÇÐÃæÄܱ»Ö´ÐС£

ÕâÀïÇ¿µ÷×Ô¶¯£¬Ò²¾ÍÊÇ˵ Spring »á×Ô¶¯×öÕâ¼þÊ£¬¶ø²»ÓÃÏñÇ°Ãæ½éÉܵģ¬ÎÒÃÇÐèÒªÏÔʽµØÖ¸¶¨´úÀíÀàµÄ bean¡£

ÎÒÃÇÈ¥µôÔ­À´µÄ ProxyFactoryBean µÄÅäÖ㬸ÄΪʹÓà BeanNameAutoProxyCreator À´ÅäÖãº

ÅäÖúܼòµ¥£¬beanNames ÖпÉÒÔʹÓÃÕýÔòÀ´Æ¥Åä bean µÄÃû×Ö¡£ÕâÑùÅäÖóöÀ´ÒÔºó£¬userServiceBeforeAdvice ºÍ userServiceAfterAdvice ÕâÁ½¸öÀ¹½ØÆ÷¾Í²»½ö½ö¿ÉÒÔ×÷ÓÃÓÚ UserServiceImpl ÁË£¬Ò²¿ÉÒÔ×÷ÓÃÓÚ OrderServiceImpl¡¢PostServiceImpl¡¢ArticleServiceImpl......µÈµÈ£¬Ò²¾ÍÊÇ˵²»ÔÙÊÇÅäÖÃij¸ö bean µÄ´úÀíÁË¡£

×¢Ò⣬ÕâÀïµÄ InterceptorNames ºÍÇ°ÃæÒ»Ñù£¬Ò²ÊÇ¿ÉÒÔÅäÖÃ³É Advisor ºÍ Interceptor µÄ¡£

È»ºóÎÒÃÇÐÞ¸ÄÏÂʹÓõĵط½£º

·¢ÏÖûÓУ¬ÎÒÃÇÔÚʹÓõÄʱºò£¬ÍêÈ«²»ÐèÒª¹ØÐÄ´úÀíÁË£¬Ö±½ÓʹÓÃÔ­À´µÄÀàÐ;ͿÉÒÔÁË£¬ÕâÊǷdz£·½±ãµÄ¡£

Êä³ö½á¹û¾ÍÊÇ OrderService ºÍ UserService ÖеÄÿ¸ö·½·¨¶¼µÃµ½ÁËÀ¹½Ø£º

×¼±¸Ö´Ðз½·¨: createUser, ²ÎÊýÁÐ±í£º[Tom, Cruise, 55]

·½·¨·µ»Ø£ºUser{firstName='Tom', lastName='Cruise', age=55, address='null'}

×¼±¸Ö´Ðз½·¨: queryUser, ²ÎÊýÁÐ±í£º[]

·½·¨·µ»Ø£ºUser{firstName='Tom', lastName='Cruise', age=55, address='null'}

×¼±¸Ö´Ðз½·¨: createOrder, ²ÎÊýÁÐ±í£º[Leo, Ëæ±ãÂòµãʲô]

·½·¨·µ»Ø£ºOrder{username='Leo', product='Ëæ±ãÂòµãʲô'}

×¼±¸Ö´Ðз½·¨: queryOrder, ²ÎÊýÁÐ±í£º[Leo]

·½·¨·µ»Ø£ºOrder{username='Leo', product='Ëæ±ãÂòµãʲô'}

µ½ÕâÀÊDz»ÊÇ·¢ÏÖ BeanNameAutoProxyCreator ·Ç³£ºÃÓã¬ËüÐèÒªÖ¸¶¨±»À¹½ØÀàÃûµÄģʽ(Èç *ServiceImpl)£¬Ëü¿ÉÒÔÅäÖöà´Î£¬ÕâÑù¾Í¿ÉÒÔÓÃÀ´Æ¥Å䲻ͬģʽµÄÀàÁË¡£

ÁíÍ⣬ÔÚ BeanNameAutoProxyCreator ͬһ¸ö°üÖУ¬»¹ÓÐÒ»¸ö·Ç³£ÓÐÓõÄÀà DefaultAdvisorAutoProxyCreator£¬±ÈÉÏÃæµÄ BeanNameAutoProxyCreator »¹Òª·½±ã¡£

֮ǰÎÒÃÇ˵¹ý£¬advisor ÄÚ²¿°ü×°ÁË advice£¬advisor ¸ºÔð¾ö¶¨À¹½ØÄÄЩ·½·¨£¬ÄÚ²¿ advice ¶¨ÒåÀ¹½ØºóµÄÂß¼­¡£ËùÒÔ£¬×ÐϸÏëÏëÆäʵ¾ÍÊÇÖ»ÒªÈÃÎÒÃÇµÄ advisor È«¾ÖÉúЧ¾ÍÄÜʵÏÖÎÒÃÇÐèÒªµÄ×Ô¶¨ÒåÀ¹½Ø¹¦ÄÜ¡¢À¹½ØºóµÄÂß¼­´¦Àí¡£

BeanNameAutoProxyCreator ÊÇ×Ô¼ºÆ¥Åä·½·¨£¬È»ºó½»ÓÉÄÚ²¿ÅäÖà advice À´À¹½Ø´¦Àí£»

¶ø DefaultAdvisorAutoProxyCreator ÊÇÈà ioc ÈÝÆ÷ÖеÄËùÓÐ advisor À´Æ¥Åä·½·¨£¬advisor ÄÚ²¿¶¼ÊÇÓÐ advice µÄ£¬ÈÃËüÃÇÄÚ²¿µÄ advice À´Ö´ÐÐÀ¹½Ø´¦Àí¡£

1¡¢ÎÒÃÇÐèÒªÔÙ»ØÍ·¿´Ï Advisor µÄÅäÖã¬ÉÏÃæÎÒÃÇÓÃÁË NameMatchMethodPointcutAdvisor Õâ¸öÀࣺ

<bean id="logCreateAdvisor" class="org.springframework.aop.support .NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logArgsAdvice" />
<property name="mappedNames" value="createUser ,createOrder" />
</bean>

Æäʵ Advisor »¹ÓÐÒ»¸ö¸ü¼ÓÁé»îµÄʵÏÖÀà RegexpMethodPointcutAdvisor£¬ËüÄÜʵÏÖÕýÔòÆ¥Å䣬È磺

<bean id="logArgsAdvisor" class="org.springframework.aop.support .RegexpMethodPointcutAdvisor">
<property name="advice" ref="logArgsAdvice" />
<property name="pattern" value="com.javadoop .*.service.*.create.*" />
</bean>

Ò²¾ÍÊÇ˵£¬ÎÒÃÇÄÜͨ¹ýÅäÖà Advisor£¬¾«È·¶¨Î»µ½ÐèÒª±»À¹½ØµÄ·½·¨£¬È»ºóʹÓÃÄÚ²¿µÄ Advice Ö´ÐÐÂß¼­´¦Àí¡£

2¡¢Ö®ºó£¬ÎÒÃÇÐèÒªÅäÖà DefaultAdvisorAutoProxyCreator£¬ËüµÄÅäÖ÷dz£¼òµ¥£¬Ö±½ÓʹÓÃÏÂÃæÕâ¶ÎÅäÖþͿÉÒÔÁË£¬Ëü¾Í»áʹµÃËùÓÐµÄ Advisor ×Ô¶¯ÉúЧ£¬ÎÞÐëÆäËûÅäÖá£

<bean class="org.springframework.aop.framework. autoproxy.DefaultAdvisorAutoProxyCreator" />

È»ºóÎÒÃÇÔËÐÐһϣº

Êä³ö£º

×¼±¸Ö´Ðз½·¨: createUser, ²ÎÊýÁÐ±í£º[Tom, Cruise, 55]

·½·¨·µ»Ø£ºUser{firstName='Tom', lastName='Cruise', age=55, address='null'}

×¼±¸Ö´Ðз½·¨: createOrder, ²ÎÊýÁÐ±í£º[Leo, Ëæ±ãÂòµãʲô]

·½·¨·µ»Ø£ºOrder{username='Leo', product='Ëæ±ãÂòµãʲô'}

´Ó½á¹û¿ÉÒÔ¿´³ö£¬create ·½·¨Ê¹ÓÃÁË logArgsAdvisor ½øÐд«²ÎÊä³ö£¬query ·½·¨Ê¹ÓÃÁË logResultAdvisor ½øÐÐÁË·µ»Ø½á¹ûÊä³ö¡£

µ½ÕâÀSpring 1.2 µÄÅäÖþÍÒª½éÉÜÍêÁË¡£±¾ÎIJ»»á½éÉܵÃ̾̾¾ãµ½£¬Ö÷ÒªÊǹØ×¢×îºËÐĵÄÅäÖã¬Èç¹û¶ÁÕ߸ÐÐËȤ£¬ÒªÑ§»á×Ô¼ºÈ¥ÃþË÷£¬±ÈÈçÕâÀïµÄ Advisor ¾Í²»Ö»ÓÐÎÒÕâÀï½éÉÜµÄ NameMatchMethodPointcutAdvisor ºÍ RegexpMethodPointcutAdvisor£¬AutoProxyCreator Ò²²»½ö½öÊÇ BeanNameAutoProxyCreator ºÍ DefaultAdvisorAutoProxyCreator¡£

¶Áµ½ÕâÀÎÒÏë¶ÔÓںܶàÈËÀ´Ëµ£¬¾ÍÖªµÀÔõôȥÔĶÁ Spring AOP Ô´ÂëÁË¡£

Spring 2.0 @AspectJ ÅäÖÃ

Spring 2.0 ÒÔºó£¬ÒýÈëÁË @AspectJ ºÍ Schema-based µÄÁ½ÖÖÅäÖ÷½Ê½£¬ÎÒÃÇÏÈÀ´½éÉÜ @AspectJ µÄÅäÖ÷½Ê½£¬Ö®ºóÎÒÃÇÔÙÀ´¿´Ê¹Óà xml µÄÅäÖ÷½Ê½¡£

×¢ÒâÁË£¬@AspectJ ºÍ AspectJ û¶à´ó¹ØÏµ£¬²¢²»ÊÇ˵»ùÓÚ AspectJ ʵÏֵ쬶ø½ö½öÊÇʹÓÃÁË AspectJ ÖеĸÅÄ°üÀ¨Ê¹ÓõÄ×¢½âÒ²ÊÇÖ±½ÓÀ´×ÔÓÚ AspectJ µÄ°ü¡£

Ê×ÏÈ£¬ÎÒÃÇÐèÒªÒÀÀµ aspectjweaver.jar Õâ¸ö°ü£¬Õâ¸ö°üÀ´×ÔÓÚ AspectJ£º

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.11</version>
</dependency>

Èç¹ûÊÇʹÓà Spring Boot µÄ»°£¬Ìí¼ÓÒÔÏÂÒÀÀµ¼´¿É£º

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

ÔÚ @AspectJ µÄÅäÖ÷½Ê½ÖУ¬Ö®ËùÒÔÒªÒýÈë aspectjweaver ²¢²»ÊÇÒòΪÎÒÃÇÐèҪʹÓà AspectJ µÄ´¦Àí¹¦ÄÜ£¬¶øÊÇÒòΪ Spring ʹÓÃÁË AspectJ ÌṩµÄһЩע½â£¬Êµ¼ÊÉÏ»¹ÊÇ´¿µÄ Spring AOP ´úÂë¡£

˵ÁËÕâô¶à£¬Ã÷È·Ò»µã£¬@AspectJ ²ÉÓÃ×¢½âµÄ·½Ê½À´ÅäÖÃʹÓà Spring AOP¡£

Ê×ÏÈ£¬ÎÒÃÇÐèÒª¿ªÆô @AspectJ µÄ×¢½âÅäÖ÷½Ê½£¬ÓÐÁ½ÖÖ·½Ê½£º

1¡¢ÔÚ xml ÖÐÅäÖãº

<aop:aspectj-autoproxy/>

2¡¢Ê¹Óà @EnableAspectJAutoProxy

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

Ò»µ©¿ªÆôÁËÉÏÃæµÄÅäÖã¬ÄÇôËùÓÐʹÓà @Aspect ×¢½âµÄ bean ¶¼»á±» Spring µ±×öÓÃÀ´ÊµÏÖ AOP µÄÅäÖÃÀ࣬ÎÒÃdzÆÖ®ÎªÒ»¸ö Aspect¡£

×¢ÒâÁË£¬@Aspect ×¢½âÒª×÷ÓÃÔÚ bean ÉÏÃæ£¬²»¹ÜÊÇʹÓà @Component µÈ×¢½â·½Ê½£¬»¹ÊÇÔÚ xml ÖÐÅäÖà bean£¬Ê×ÏÈËüÐèÒªÊÇÒ»¸ö bean¡£

±ÈÈçÏÂÃæÕâ¸ö bean£¬ËüµÄÀàÃûÉÏʹÓÃÁË @Aspect£¬Ëü¾Í»á±»µ±×ö Spring AOP µÄÅäÖá£

<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
<!-- configure properties of aspect here as normal -->
</bean>

package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class NotVeryUsefulAspect {

}

½ÓÏÂÀ´£¬ÎÒÃÇÐèÒª¹ØÐĵÄÊÇ @Aspect ×¢½âµÄ bean ÖУ¬ÎÒÃÇÐèÒªÅäÖÃÄÄЩÄÚÈÝ¡£

Ê×ÏÈ£¬ÎÒÃÇÐèÒªÅäÖà Pointcut£¬Pointcut Ôڴ󲿷ֵط½±»·­Òë³ÉÇе㣬ÓÃÓÚ¶¨ÒåÄÄЩ·½·¨ÐèÒª±»ÔöÇ¿»òÕß˵ÐèÒª±»À¹½Ø£¬ÓеãÀàËÆÓÚ֮ǰ½éÉÜµÄ Advisor µÄ·½·¨Æ¥Åä¡£

Spring AOP Ö»Ö§³Ö bean Öеķ½·¨£¨²»Ïñ AspectJ ÄÇôǿ´ó£©£¬ËùÒÔÎÒÃÇ¿ÉÒÔÈÏΪ Pointcut ¾ÍÊÇÓÃÀ´Æ¥Åä Spring ÈÝÆ÷ÖеÄËùÓÐ bean µÄ·½·¨µÄ¡£

@Pointcut("execution(* transfer(..))")// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature

ÎÒÃÇ¿´µ½£¬@Pointcut ÖÐʹÓÃÁË execution À´ÕýÔòÆ¥Åä·½·¨Ç©Ãû£¬ÕâÒ²ÊÇ×î³£Óõ쬳ýÁË execution£¬ÎÒÃÇÔÙ¿´¿´ÆäËûµÄ¼¸¸ö±È½Ï³£ÓÃµÄÆ¥Å䷽ʽ£º

within£ºÖ¸¶¨ËùÔÚÀà»òËùÔÚ°üÏÂÃæµÄ·½·¨£¨Spring AOP ¶ÀÓУ©Èç

Èç @Pointcut("within(com.javadoop. springaoplearning.service..*)")

@annotation£º·½·¨ÉϾßÓÐÌØ¶¨µÄ×¢½â£¬Èç @Subscribe ÓÃÓÚ¶©ÔÄÌØ¶¨µÄʼþ¡£

Èç @Pointcut("execution( .*(..)) && @annotation(com.javadoop.annotation.Subscribe)")

bean(idOrNameOfBean)£ºÆ¥Åä bean µÄÃû×Ö£¨Spring AOP ¶ÀÓУ©

Èç @Pointcut("bean(*Service)")

Tips£ºÉÏÃæÆ¥ÅäÖУ¬Í¨³£ "." ´ú±íÒ»¸ö°üÃû£¬".." ´ú±í°ü¼°Æä×Ó°ü£¬·½·¨²ÎÊýÈÎÒâÆ¥ÅäʹÓÃÁ½¸öµã ".."¡£

¶ÔÓÚ web ¿ª·¢Õߣ¬Spring ÓиöºÜºÃµÄ½¨Ò飬¾ÍÊǶ¨ÒåÒ»¸ö SystemArchitecture£º

@Aspect
public class SystemArchitecture {

// web ²ã
@Pointcut("within(com.javadoop.web..*)")
public void inWebLayer() {}

// service ²ã
@Pointcut("within(com.javadoop.service..*)")
public void inServiceLayer() {}

// dao ²ã
@Pointcut("within(com.javadoop.dao..*)")
public void inDataAccessLayer() {}

// service ʵÏÖ£¬×¢ÒâÕâÀïÖ¸µÄÊÇ·½·¨ÊµÏÖ£¬Æäʵͨ³£Ò²¿ÉÒÔʹÓà bean(*ServiceImpl)
@Pointcut("execution(* com.javadoop..service.*.*(..))")
public void businessService() {}

// dao ʵÏÖ
@Pointcut("execution(* com.javadoop.dao.*.*(..))")
public void dataAccessOperation() {}
}>

ÉÏÃæÕâ¸ö SystemArchitecture ºÜºÃÀí½â£¬¸Ã Aspect ¶¨ÒåÁËÒ»¶ÑµÄ Pointcut£¬ËæºóÔÚÈκÎÐèÒª Pointcut µÄµØ·½¶¼¿ÉÒÔÖ±½ÓÒýÓã¨Èç xml ÖÐµÄ pointcut-ref=""£©¡£

ÅäÖà pointcut ¾ÍÊÇÅäÖÃÎÒÃÇÐèÒªÀ¹½ØÄÄЩ·½·¨£¬½ÓÏÂÀ´£¬ÎÒÃÇÒªÅäÖÃÐèÒª¶ÔÕâЩ±»À¹½ØµÄ·½·¨×öʲô£¬Ò²¾ÍÊÇÇ°Ãæ½éÉÜµÄ Advice¡£

½ÓÏÂÀ´£¬ÎÒÃÇÒªÅäÖà Advice¡£

ÏÂÃæÕâ¿é´úÂëʾÀýÁ˸÷ÖÖ³£ÓõÄÇé¿ö£º

×¢Ò⣬ʵ¼Êд´úÂëµÄʱºò£¬²»Òª°ÑËùÓеÄÇÐÃæ¶¼ÈàÔÚÒ»¸ö class ÖС£

@Aspect
public class AdviceExample {

// ÕâÀï»áÓõ½ÎÒÃÇÇ°ÃæËµµÄ SystemArchitecture
// ÏÂÃæ·½·¨¾ÍÊÇдÀ¹½Ø "dao²ãʵÏÖ"
@Before("com.javadoop.aop.SystemArchitecture .dataAccessOperation()")
public void doAccessCheck() {
// ... ʵÏÖ´úÂë
}

// µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔÖ±½Ó"ÄÚÁª"Pointcut£¬Ö±½ÓÔÚÕâÀﶨÒå Pointcut
// °Ñ Advice ºÍ Pointcut ºÏÔÚÒ»ÆðÁË£¬µ«ÊÇÕâÁ½¸ö¸ÅÄîÎÒÃÇ»¹ÊÇ񻂿·ÖÇå³þµÄ
@Before("execution(* com.javadoop.dao.*.*(..))")
public void doAccessCheck() {
// ... ʵÏÖ´úÂë
}

@AfterReturning("com.javadoop.aop.SystemArchitecture .dataAccessOperation()")
public void doAccessCheck() {
// ...
}

@AfterReturning(
pointcut="com.javadoop.aop.SystemArchitecture .dataAccessOperation()",
returning="retVal")
public void doAccessCheck(Object retVal) {
// ÕâÑù£¬½øÀ´Õâ¸ö·½·¨µÄ´¦Àíʱºò£¬retVal ¾ÍÊÇÏàÓ¦·½·¨µÄ·µ»ØÖµ£¬ÊDz»ÊǷdz£·½±ã
// ... ʵÏÖ´úÂë
}

// Òì³£·µ»Ø
@AfterThrowing("com.javadoop.aop.SystemArchitecture .dataAccessOperation()")
public void doRecoveryActions() {
// ... ʵÏÖ´úÂë
}

@AfterThrowing(
pointcut="com.javadoop.aop.SystemArchitecture .dataAccessOperation()",
throwing="ex")
public void doRecoveryActions(DataAccessException ex) {
// ... ʵÏÖ´úÂë
}

// ×¢ÒâÀí½âËüºÍ @AfterReturning Ö®¼äµÄÇø±ð£¬ÕâÀï»áÀ¹½ØÕý³£·µ»ØºÍÒì³£µÄÇé¿ö
@After("com.javadoop.aop.SystemArchitecture .dataAccessOperation()")
public void doReleaseLock() {
// ͨ³£¾ÍÏñ finally ¿éÒ»ÑùʹÓã¬ÓÃÀ´ÊÍ·Å×ÊÔ´¡£
// ÎÞÂÛÕý³£·µ»Ø»¹ÊÇÒì³£Í˳ö£¬¶¼»á±»À¹½Øµ½
}

// ¸Ð¾õÕâ¸öºÜÓÐÓðɣ¬¼ÈÄÜ×ö @Before µÄÊÂÇ飬Ҳ¿ÉÒÔ×ö @AfterReturning µÄÊÂÇé
@Around("com.javadoop.aop.SystemArchitecture .businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}

}

ϸÐĵĶÁÕß¿ÉÄÜ·¢ÏÖÁËÓÐЩ Advice ȱÉÙ·½·¨´«²Î£¬ÈçÔÚ @Before ³¡¾°ÖвÎÊýÍùÍùÊǷdz£ÓÐÓõ쬱ÈÈçÎÒÃÇÒªÓÃÈÕÖ¾¼Ç¼ÏÂÀ´±»À¹½Ø·½·¨µÄÈë²ÎÇé¿ö¡£

Spring ÌṩÁ˷dz£¼òµ¥µÄ»ñÈ¡Èë²ÎµÄ·½·¨£¬Ê¹Óà org.aspectj.lang.JoinPoint ×÷Ϊ Advice µÄµÚÒ»¸ö²ÎÊý¼´¿É£¬È磺

@Before("com.javadoop.springaoplearning .aop_spring_2_aspectj.SystemArchitecture .businessService()")
public void logArgs(JoinPoint joinPoint) {
System.out.println("·½·¨Ö´ÐÐǰ£¬´òÓ¡Èë²Î£º" + Arrays.toString(joinPoint.getArgs()));
}

×¢Ò⣺µÚÒ»£¬±ØÐë·ÅÖÃÔÚµÚÒ»¸ö²ÎÊýÉÏ£»µÚ¶þ£¬Èç¹ûÊÇ @Around£¬ÎÒÃÇͨ³£»áʹÓÃÆä×ÓÀà ProceedingJoinPoint£¬ÒòΪËüÓÐ procceed()/procceed(args[]) ·½·¨¡£

µ½ÕâÀÎÒÃǽéÉÜÍêÁË @AspectJ ÅäÖ÷½Ê½ÖÐµÄ Pointcut ºÍ Advice µÄÅäÖ᣶ÔÓÚ¿ª·¢ÕßÀ´Ëµ£¬Æäʵ×îÖØÒªµÄ¾ÍÊÇÕâÁ½¸öÁË£¬¶¨Òå Pointcut ºÍʹÓúÏÊ浀 Advice ÔÚ¸÷¸ö Pointcut ÉÏ¡£

ÏÂÃæ£¬ÎÒÃÇÓÃÕâÒ»½Ú½éÉÜµÄ @AspectJ À´ÊµÏÖÉÏÒ»½ÚʵÏֵļǼ·½·¨´«²ÎºÍ¼Ç¼·½·¨·µ»ØÖµ¡£

xml µÄÅäÖ÷dz£¼òµ¥£º

ÕâÀïÊÇʾÀý£¬ËùÒÔ bean µÄÅäÖû¹ÊÇʹÓÃÁË xml µÄÅäÖ÷½Ê½¡£

²âÊÔһϣº

Êä³ö½á¹û£º

·½·¨Ö´ÐÐǰ£¬´òÓ¡Èë²Î£º[Tom, Cruise, 55]
User{firstName='Tom', lastName='Cruise', age=55, address='null'}
·½·¨Ö´ÐÐǰ£¬´òÓ¡Èë²Î£º[]
User{firstName='Tom', lastName='Cruise', age=55, address='null'}

JoinPoint ³ýÁË getArgs() Í⻹ÓÐһЩÓÐÓõķ½·¨£¬´ó¼Ò¿ÉÒÔ½øÈ¥ÉÔ΢¿´Ò»ÑÛ¡£

×îºóÌáÒ»µã£¬@Aspect ÖеÄÅäÖò»»á×÷ÓÃÓÚʹÓà @Aspect ×¢½âµÄ bean¡£

Spring 2.0 schema-based ÅäÖÃ

±¾½Ú½«½éÉܵÄÊÇ Spring 2.0 ÒÔºóÌṩµÄ»ùÓÚ <aop /> ÃüÃû¿Õ¼äµÄ XML ÅäÖá£ÕâÀï˵µÄ schema-based ¾ÍÊÇÖ¸»ùÓÚ aop Õâ¸ö schema¡£

½éÉÜ IOC µÄʱºòÒ²½éÉܹý Spring ÊÇÔõô½âÎö¸÷¸öÃüÃû¿Õ¼äµÄ£¨¸÷ÖÖ *NamespaceHandler£©£¬½âÎö <aop /> µÄÔ´ÂëÔÚ org.springframework.aop.config.AopNamespaceHandler ÖС£

ÓÐÁËÇ°ÃæµÄ @AspectJ µÄÅäÖ÷½Ê½µÄ֪ʶ£¬Àí½â xml ·½Ê½µÄÅäÖ÷dz£¼òµ¥£¬ËùÒÔÎÒÃǾͿÉÒÔ·Ï»°ÉÙÒ»µãÁË¡£

ÕâÀïÏȽéÉÜÅäÖà Aspect£¬±ãÓÚºóÐøÀí½â£º

<aop:config>
<aop:aspect id="myAspect" ref="aBean">
...
</aop:aspect>
</aop:config>

<bean id="aBean" class="...">
...
</bean>

ËùÓеÄÅäÖö¼ÔÚ <aop:config> ÏÂÃæ¡£

<aop:aspect > ÖÐÐèÒªÖ¸¶¨Ò»¸ö bean£¬ºÍÇ°Ãæ½éÉÜµÄ LogArgsAspect ºÍ LogResultAspect Ò»Ñù£¬ÎÒÃÇÖªµÀ¸Ã bean ÖÐÎÒÃÇÐèҪд´¦Àí´úÂë¡£

È»ºó£¬ÎÒÃÇдºÃ Aspect ´úÂëºó£¬½«Æä¡°Ö¯È롱µ½ºÏÊ浀 Pointcut ÖУ¬Õâ¾ÍÊÇÃæÏòÇÐÃæ¡£

È»ºó£¬ÎÒÃÇÐèÒªÅäÖà Pointcut£¬·Ç³£¼òµ¥£¬ÈçÏ£º

<aop:config>

<aop:pointcut id="businessService"
expression="execution(* com.javadoop.springaoplearning.service.*.*(..))"/>

<!--Ò²¿ÉÒÔÏñÏÂÃæÕâÑù-->
<aop:pointcut id="businessService2"
expression="com.javadoop.SystemArchitecture .businessService()"/>

</aop:config>

½« <aop:pointcut> ×÷Ϊ <aop:config> µÄÖ±½Ó×ÓÔªËØ£¬½«×÷Ϊȫ¾Ö Pointcut¡£

ÎÒÃÇÒ²¿ÉÒÔÔÚ <aop:aspect />ÄÚ²¿ÅäÖà Pointcut£¬ÕâÑù¸Ã Pointcut ½öÓÃÓڸà Aspect£º

<aop:config>
<aop:aspect ref="logArgsAspect">
<aop:pointcut id="internalPointcut"
expression="com.javadoop.SystemArchitecture .businessService()" />
</aop:aspect>
</aop:config>

½ÓÏÂÀ´£¬ÎÒÃÇÓ¦¸ÃÅäÖà Advice ÁË£¬ÎªÁ˱ÜÃâ·Ï»°¹ý¶à£¬ÎÒÃÇÖ±½ÓÉÏʵÀý°É£¬·Ç³£ºÃÀí½â£¬½«ÉÏÒ»½ÚÓà @AspectJ ·½Ê½ÅäÖõİá¹ýÀ´£º

ÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇÅäÖÃÁËÁ½¸ö LogArgsAspect ºÍÒ»¸ö LogResultAspect¡£

Æäʵ»ùÓÚ XML µÄÅäÖÃÒ²ÊǷdz£Áé»îµÄ£¬ÕâÀïû°ì·¨¸ø´ó¼ÒÑÝʾ¸÷ÖÖ´îÅ䣬´ó¼Òץס»ù±¾µÄ Pointcut¡¢Advice ºÍ Aspect Õ⼸¸ö¸ÅÄ¾ÍºÜÈÝÒ×ÅäÖÃÁË¡£

С½á

µ½ÕâÀ±¾ÎĽéÉÜÁË Spring AOP µÄÈýÖÖÅäÖ÷½Ê½£¬ÎÒÃÇÒªÖªµÀµÄÊÇ£¬µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇʹÓõͼÊÇ Spring AOP£¬ºÍ AspectJ ûʲô¹ØÏµ¡£

 
   
2937 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö