×î¼Ñʵ¼ù
×èֹ̫¹ýʹÓãºAOPËäÈ»¹¦Ð§Ç¿Ê¢?£¬µ«?Ì«¹ýʹÓÿÉÄܻᵼÖ´úÂëÄÑÒÔÃ÷È·ºÍά»¤¡£Òò´Ë£¬ÔÚʹÓÃAOPʱӦ¼á³Ö¾«Á·ºÍÃ÷È·£¬×èÖ¹½«ËùÓкáÇйØ×¢µã¶¼×ªÒƵ½ÇÐÃæÖС£
×¢ÖØ²âÊÔ£ºÇÐÃæµÄÂß¼ËäÈ»Ïà¶Ô×ÔÁ¦£¬µ«ËüÃÇÓëÓªÒµÂ߼ϸÃÜÏàÁ¬¡£Òò´Ë?£¬Ó¦¸Ã¶ÔÇÐÃæ¾ÙÐгä·ÖµÄ²âÊÔ£¬È·±£ËüÃÇÔÚÏÖʵʹÓÃÖв»»áÒýÈëеÄÎÊÌâ¡£
ÎĵµºÍ×¢ÊÍ£ºÎªÃ¿¸öÇÐÃæ±àдÏêϸµÄÎĵµºÍ×¢ÊÍ£¬×ÊÖúÍŶӳÉÔ±Ã÷È·ÇÐÃæµÄ×÷ÓúÍʵÏÖ·½·¨£¬Ìá¸ß´úÂëµÄ¿Éά»¤ÐÔ¡£
ͨ¹ýÒÔÉÏÏêϸµÄ¹¦Ð§ÏÈÈݺÍÊÊÓÃÖ¸ÄÏ£¬Ï£ÍûÄÜ×ÊÖúÄã¸üºÃµØÃ÷È·ºÍÓ¦ÓúÃÉ«ÏÈÉúµÄAOP¹¦Ð§¡£ÎÞÂÛÄãÊÇÐÂÊÖÕÕ¾É×ÊÉ·¢Õߣ¬ÕÆÎÕÕâЩ¼¼Çɶ¼½«ÎªÄãµÄÏîÄ¿¿ª·¢´øÀ´ÏÔÖøµÄÌáÉý¡£ÏÂÃæÎÒÃǽ«ÉîÈë̽ÌÖһЩÏÖʵµÄÓ¦Óó¡¾°£¬²¢ÌṩһЩÊÊÓõļ¼ÇÉ£¬ÒÔ±ãÄãÄÜÔÚÕæÊµ¿ª·¢ÇéÐÎÖгä·ÖÑéÕ¹ºÃÉ«ÏÈÉúAOPµÄDZÁ¦¡£
ÓÅ»¯ÇÐÃæÐÔÄÜ
ÇÐÃæµÄÖ´ÐпÉÄÜ»áÓ°ÏìϵͳµÄÐÔÄÜ£¬Òò´ËÔÚÉè¼ÆºÍʹÓÃÇÐÃæÊ±Ó¦×¢ÖØÒÔϼ¸µã£º
×èÖ¹ÔÚÎ§ÈÆÍ¨ÖªÖоÙÐÐÖØ´óÅÌËã£ºÎ§ÈÆÍ¨ÖªÔÚÄ¿µÄÒªÁìÖ´ÐÐǰºó»á¾ÙÐÐÁ½´ÎŲÓã¬Òò´ËÔÚÎ§ÈÆÍ¨ÖªÖÐ×èÖ¹¾ÙÐÐÖØ´óÅÌËã»òI/O²Ù×÷£¬ÒÔÃâÓ°ÏìÐÔÄÜ¡£
ºÏÀíÑ¡ÔñÅþÁ¬µãÆ¥Å乿Ôò£º¹ýÓÚ¿íËɵÄÅþÁ¬µãÆ¥Å乿Ôò¿ÉÄܻᵼÖ²»ÐëÒªµÄÇÐÃæÖ´ÐУ¬´Ó¶øÓ°ÏìÐÔÄÜ¡£Òò´Ë£¬Ó¦Ö»¹Ü׼ȷµØ½ç˵ÅþÁ¬µãÆ¥Å乿Ôò¡£
ʹÓøßЧµÄÖ¯Èë·½·¨£ºÆ¾Ö¤ÏîÄ¿ÐèÇóÑ¡ÔñºÏÊʵÄÖ¯Èë·½·¨£¨Èç±àÒëʱ֯Èë¡¢ÔËÐÐʱ֯ÈëºÍLoad-timeWeavable£©£¬ÒÔʵÏÖ×î¼ÑµÄÐÔÄܺͼæÈÝÐÔ¡£
ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇÍŽáÁËÒªÁìÊðÃû¡¢²ÎÊýºÍ×Ô½ç˵ע½âÀ´½ç˵ÇÐÈëµã¡£###7.¶¯Ì¬´úÀíÓëJDK¶¯Ì¬´úÀíºÃÉ«ÏÈÉúAOPÖ§³ÖÁ½ÖÖ¶¯Ì¬´úÀí·½·¨£ºJDK¶¯Ì¬´úÀíºÍCGLIB´úÀí¡£ÔÚ²î±ðµÄ³¡¾°ÖУ¬Ñ¡Ôñ²î±ðµÄ´úÀí·½·¨¿ÉÒÔ´øÀ´¸üºÃµÄÐÔÄܺÍÎÞаÐÔ¡£####7.1JDK¶¯Ì¬´úÀíJDK¶¯Ì¬´úÀíÊÊÓÃÓÚʵÏÖÁ˽ӿڵÄÀà¡£
ÀýÈ磬ÈôÊÇÄãÓÐÒ»¸öʵÏÖÁËij¸ö½Ó¿ÚµÄ·þÎñÀ࣬Äã¿ÉÒÔʹÓÃJDK¶¯Ì¬´úÀíÀ´ÔöÇ¿Õâ¸öÀࣺ
java@Aspect@ComponentpublicclassLoggingAspect{
}
####7.2CGLIB´úÀíCGLIB´úÀíÊÊÓÃÓڷǽӿÚÀà¡£ÈôÊÇÄãÐèÒª¶ÔÒ»¸ö·Ç½Ó¿ÚÀà¾ÙÐÐÔöÇ¿£¬¿ÉÒÔʹÓÃCGLIB´úÀí£º
java@Configuration@EnableAspectJAutoProxy(proxyTargetClass=true)publicclassAppConfig{}
ͨ¹ýÉèÖÃ`proxyTargetClass=true`£¬ÎÒÃÇ¿ÉÒÔʹÓÃCGLIB´úÀíÀ´ÔöÇ¿·Ç½Ó¿ÚÀà¡£###8.ÏÖʵӦÓó¡¾°####8.1ÈÕÖ¾¼Í¼ÈÕÖ¾¼Í¼ÊÇAOP×î³£¼ûµÄ?Ó¦Óó¡¾°Ö®Ò»¡£Í¨¹ý½ç˵һ¸öÇÐÃæ£¬¿ÉÒÔÔÚ²»ÐÞ¸ÄÏÖÓдúÂëµÄÇéÐÎÏ£¬ÔÚÒªÁìŲÓÃǰºó¼Í¼ÈÕÖ¾¡£
java@Aspect@ComponentpublicclassLoggingAspect{
1Î§ÈÆÍ¨Öª
Î§ÈÆÍ¨ÖªÊÇAOPÖÐ×îǿʢ?µÄ֪ͨÀàÐÍ£¬Ëü¿ÉÒÔÔÚÄ¿µÄÒªÁìÖ´ÐÐǰºó¾ÙÐÐ×Ô½ç˵²Ù×÷£¬ÉõÖÁ¿ÉÒÔÍêÈ«Ìæ»»Ä¿µÄÒªÁìµÄÖ´ÐС£ÀýÈ磺
@AspectpublicclassPerformanceLoggingAspect{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(PerformanceLoggingAspect.class);@Around("execution(*com.example.service.UserService.*(..))")publicObjectlogAroundMethod(ProceedingJoinPointjoinPoint)throwsThrowable{logger.info("Methodexecutionstarted...");longstartTime=System.currentTimeMillis();Objectresult=joinPoint.proceed();//CalltheactualmethodlongexecutionTime=System.currentTimeMillis()-startTime;logger.info("Methodexecutioncompleted.Result:"+result+".Executiontime:"+executionTime+"ms");returnresult;}}ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇʹÓÃÁË`@Around`×¢½â½ç˵ÁËÒ»¸öÎ§ÈÆÍ¨Öª£¬ËüÔÚÄ¿µÄÒªÁìÖ´ÐÐǰºó¾ÙÐÐÁËÈÕÖ¾¼Í¼ºÍÖ´ÐÐʱ¼äÅÌËã¡£
ǿʢµÄ?֪ͨ»úÖÆ
ºÃÉ«ÏÈÉúÌṩÁ˸»ºñµÄ֪ͨÀàÐÍ£¬°üÀ¨Ç°ÖÃ֪ͨ£¨Before£©¡¢ºóÖÃ֪ͨ£¨After£©¡¢Ò쳣֪ͨ£¨AfterThrowing£©¡¢ÍË»¯Í¨Öª£¨AfterReturning£©ÒÔ¼°Î§ÈÆÍ¨Öª£¨Around£©¡£¿ª·¢Õß¿ÉÒÔÆ¾Ö¤ÐèҪѡÔñºÏÊʵÄ֪ͨÀàÐÍ£¬ÊµÏÖ¶Ô´úÂëµÄÖÜÈ«¿ØÖÆ¡£
ʹÓÃÎ§ÈÆÍ¨Öª
@AspectpublicclassPerformanceAspect{@Around("execution(*com.example.service.*.*(..))")publicObjectmeasurePerformance(ProceedingJoinPointjoinPoint)throwsThrowable{longstart=System.currentTimeMillis();try{returnjoinPoint.proceed();//¼ÌÐøÖ´ÐÐÄ¿µÄÒªÁì}finally{longend=System.currentTimeMillis();System.out.println(joinPoint.getSignature()+"executedin"+(end-start)+"ms");}}}
¸ß¼¶ÓÅ»¯¼¼ÇÉ
ÇÐÃæ×éºÏ£º¶à¸öÇÐÃæ¿ÉÒÔ×éºÏÔÚÒ»Æð£¬ÐγÉÖØ´óµÄÇÐÃæÁ´£¬ÒÔʵÏÖ¸üÖØ´óµÄ¹¦Ð§¡£ÀýÈ磬¿ÉÒÔ½«ÈÕÖ¾ÇÐÃæºÍÇå¾²ÇÐÃæÍŽáʹÓã¬È·±£?ÔÚÓªÒµÂß¼ÖÐ×Ô¶¯¼Í¼ÈÕÖ¾²¢¾ÙÐÐÇå¾²¿ØÖÆ¡£
Ö¯Èë·½·¨£ººÃÉ«ÏÈÉúÖ§³Ö¶àÖÖÖ¯Èë·½·¨£¨Èç±àÒëʱ֯Èë¡¢ÔËÐÐʱ֯ÈëºÍLoad-timeWeavable£©£¬Æ¾Ö¤²î±ðµÄÐèÇóÑ¡ÔñºÏÊʵÄÖ¯Èë·½·¨£¬ÒÔʵÏÖ×î¼ÑµÄÐÔÄܺͼæÈÝÐÔ¡£
ÐÔÄÜ¼à¿Ø£ºÊ¹ÓúÃÉ«ÏÈÉúµÄµ÷ÊÔºÍ¼à¿Ø¹¦Ð§£¬¿ÉÒÔ¶ÔÇÐÃæµÄÖ´ÐÐÇéÐξÙÐÐʵʱ¼à¿Ø£¬ÕÒ³öÐÔÄÜÆ¿¾±²¢¾ÙÐÐÓÅ»¯¡£
У¶Ô£ºÖì¹ãȨ(f3J1ePQDlzHhwh44q38w4Ima2E3XrDq)



