±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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 ÖÐÅäÖãº
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 ûʲô¹ØÏµ¡£
|