{"id":245,"date":"2026-05-05T21:20:49","date_gmt":"2026-05-05T13:20:49","guid":{"rendered":"https:\/\/larkdrop.cafe\/?p=245"},"modified":"2026-05-22T16:51:47","modified_gmt":"2026-05-22T08:51:47","slug":"spring-aop","status":"publish","type":"post","link":"https:\/\/larkdrop.cafe\/index.php\/2026\/05\/05\/spring-aop\/","title":{"rendered":"Spring AOP"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">AOP\u6982\u8ff0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-1-\u4ec0\u4e48\u662faop\">\u4ec0\u4e48\u662fAOP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>AOP\uff08Aspect-oriented Programming\uff09<\/strong>&nbsp;\u662f\u9762\u5411\u5207\u9762\u7f16\u7a0b\uff0c\u5b83\u8865\u5145\u4e86OOP\uff08\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff09\u7684\u4e0d\u8db3\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u7279\u6027<\/th><th class=\"has-text-align-left\" data-align=\"left\">OOP<\/th><th class=\"has-text-align-left\" data-align=\"left\">AOP<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u57fa\u672c\u5355\u5143<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7c7b\uff08Class\uff09<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5207\u9762\uff08Aspect\uff09<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u5173\u6ce8\u70b9<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7eb5\u5411\u4e1a\u52a1\u903b\u8f91<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6a2a\u5411\u516c\u5171\u903b\u8f91<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u89e3\u51b3\u95ee\u9898<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e1a\u52a1\u6a21\u5757\u5316<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6a2a\u5207\u5173\u6ce8\u70b9\u5206\u79bb<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-2-\u4e3a\u4ec0\u4e48\u9700\u8981aop\">\u4e3a\u4ec0\u4e48\u9700\u8981AOP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u60f3\u8c61\u4e00\u4e2a\u573a\u666f\uff1a\u591a\u4e2aService\u65b9\u6cd5\u90fd\u9700\u8981\u8bb0\u5f55\u65e5\u5fd7<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u6ca1\u6709AOP\u65f6 - \u65e5\u5fd7\u4ee3\u7801\u5206\u6563\u5404\u5904\npublic class UserServiceImpl {\n    public void createUser(String name) {\n        System.out.println(\"&#91;\u65e5\u5fd7] \u65b9\u6cd5\u5f00\u59cb\");  \/\/ \u91cd\u590d\u4ee3\u7801\n        \/\/ \u4e1a\u52a1\u903b\u8f91\n        System.out.println(\"&#91;\u65e5\u5fd7] \u65b9\u6cd5\u7ed3\u675f\");  \/\/ \u91cd\u590d\u4ee3\u7801\n    }\n}\n\npublic class OrderServiceImpl {\n    public void createOrder(String product) {\n        System.out.println(\"&#91;\u65e5\u5fd7] \u65b9\u6cd5\u5f00\u59cb\");  \/\/ \u91cd\u590d\u4ee3\u7801\n        \/\/ \u4e1a\u52a1\u903b\u8f91\n        System.out.println(\"&#91;\u65e5\u5fd7] \u65b9\u6cd5\u7ed3\u675f\");  \/\/ \u91cd\u590d\u4ee3\u7801\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u95ee\u9898<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u274c \u65e5\u5fd7\u4ee3\u7801\u4e0e\u4e1a\u52a1\u903b\u8f91\u5f3a\u8026\u5408<\/li>\n\n\n\n<li>\u274c \u4ee3\u7801\u91cd\u590d\uff0c\u65e0\u6cd5\u590d\u7528<\/li>\n\n\n\n<li>\u274c \u4fee\u6539\u65e5\u5fd7\u903b\u8f91\u9700\u8981\u6539\u52a8\u591a\u5904<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>AOP\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u5c06\u65e5\u5fd7\u903b\u8f91\u5c01\u88c5\u6210\u5207\u9762\uff0c\u81ea\u52a8\u5e94\u7528\u5230\u76ee\u6807\u65b9\u6cd5<\/p>\n\n\n\n<figure class=\"wp-block-image\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/cross-cutting-concerns-diagram.svg'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/cross-cutting-concerns-diagram.svg\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\u591a\u4e2a\u4e1a\u52a1\u65b9\u6cd5\u5171\u4eab\u7edf\u4e00\u5207\u9762\u903b\u8f91\u7684\u7ed3\u6784\u56fe\"\/><\/div><figcaption class=\"wp-element-caption\">\u591a\u4e2a\u4e1a\u52a1\u65b9\u6cd5\u5171\u4eab\u7edf\u4e00\u5207\u9762\u903b\u8f91\u7684\u7ed3\u6784\u56fe<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-3-\u5207\u9762\u8981\u7d20\">\u5207\u9762\u8981\u7d20<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/image-20260503025308652.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/image-20260503025308652.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"image-20260503025308652\"\/><\/div><figcaption class=\"wp-element-caption\">image-20260503025308652<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AOP \u771f\u6b63\u8981\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u4e0d\u662f\u91cd\u65b0\u5199\u4e1a\u52a1\u65b9\u6cd5\uff0c\u800c\u662f\u660e\u786e\u201c\u54ea\u4e9b\u7ec4\u4ef6\u9700\u8981\u88ab\u589e\u5f3a\u3001\u5728\u65b9\u6cd5\u6267\u884c\u7684\u4ec0\u4e48\u9636\u6bb5\u505a\u4ec0\u4e48\u4e8b\u201d\u3002\u6240\u4ee5\u4e00\u4e2a\u5207\u9762\u81f3\u5c11\u8981\u56de\u7b54\u4e24\u4e2a\u95ee\u9898<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u589e\u5f3a\u8303\u56f4\u600e\u4e48\u5708\u5b9a<\/li>\n\n\n\n<li>\u589e\u5f3a\u52a8\u4f5c\u5982\u4f55\u6267\u884c\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9a\u4e49\u4e00\u4e2a\u5207\u9762\u9700\u8981\u4e24\u4e2a\u6838\u5fc3\u8981\u7d20\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u8981\u7d20<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u8bf4\u660e<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u5bf9\u5e94\u6982\u5ff5<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>What + When<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5c01\u88c5\u4ec0\u4e48\u903b\u8f91\uff0c\u4ec0\u4e48\u65f6\u5019\u6267\u884c<\/td><td class=\"has-text-align-left\" data-align=\"left\">Advice\uff08\u901a\u77e5\uff09<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Where<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5bf9\u54ea\u4e9b\u7c7b\u7684\u54ea\u4e9b\u65b9\u6cd5\u751f\u6548<\/td><td class=\"has-text-align-left\" data-align=\"left\">Pointcut\uff08\u5207\u5165\u70b9\uff09<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AOP \u7684\u5e95\u5c42\u652f\u6491\u5c31\u662f\u52a8\u6001\u4ee3\u7406\u3002Spring \u5bb9\u5668\u8d1f\u8d23\u7ba1\u7406 Bean\uff0cAOP \u7684\u505a\u6cd5\u662f\u5728\u5408\u9002\u7684 Bean \u5916\u5c42\u5305\u4e0a\u4e00\u5c42\u4ee3\u7406\u5bf9\u8c61\uff0c\u8ba9\u516c\u5171\u903b\u8f91\u5728\u4e0d\u6539\u4e1a\u52a1\u4ee3\u7801\u7684\u524d\u63d0\u4e0b\u88ab\u7edf\u4e00\u7ec7\u5165\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u4e2d\uff0c\u201c\u54ea\u4e9b\u7ec4\u4ef6\u3001\u54ea\u4e9b\u65b9\u6cd5\u9700\u8981\u589e\u5f3a\u201d\u5bf9\u5e94&nbsp;<code>Where<\/code>\uff1b\u201c\u589e\u5f3a\u903b\u8f91\u505a\u4ec0\u4e48\u3001\u5728\u4ec0\u4e48\u65f6\u5019\u6267\u884c\u201d\u5bf9\u5e94&nbsp;<code>What + When<\/code>\u3002\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u6210\uff1a\u4e00\u4e2a\u8d1f\u8d23\u5708\u5b9a\u8303\u56f4\uff0c\u4e00\u4e2a\u8d1f\u8d23\u5b89\u6392\u589e\u5f3a\u52a8\u4f5c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"\u672c\u7ae0\u5c0f\u7ed3\">\u5c0f\u7ed3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u672c\u7ae0\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1aAOP \u7684\u4ef7\u503c\u4e0d\u5728\u4e8e\u201c\u591a\u5b66\u4e00\u4e2a\u65b0\u540d\u8bcd\u201d\uff0c\u800c\u5728\u4e8e\u628a\u65e5\u5fd7\u3001\u4e8b\u52a1\u3001\u6743\u9650\u8fd9\u7c7b\u6a2a\u5207\u903b\u8f91\u4ece\u4e1a\u52a1\u4ee3\u7801\u4e2d\u62bd\u79bb\u51fa\u6765\uff0c\u8ba9\u7cfb\u7edf\u66f4\u5bb9\u6613\u590d\u7528\u548c\u7ef4\u62a4\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AOP\u6838\u5fc3\u672f\u8bed<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u672f\u8bed<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u82f1\u6587<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u76ee\u6807\u7c7b<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Target<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u9700\u8981\u88ab\u4ee3\u7406\u7684\u539f\u59cb\u7c7b<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u4ee3\u7406\u7c7b<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Proxy<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u52a8\u6001\u4ee3\u7406\u751f\u6210\u7684\u7c7b<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u8fde\u63a5\u70b9<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">JoinPoint<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u4ee5\u88ab\u589e\u5f3a\u7684\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u5207\u5165\u70b9<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">PointCut<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5b9a\u4e49\u54ea\u4e9b\u8fde\u63a5\u70b9\u4f1a\u88ab\u589e\u5f3a<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Advice<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5177\u4f53\u7684\u589e\u5f3a\u903b\u8f91<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u5207\u9762<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Aspect<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5207\u5165\u70b9 + \u901a\u77e5\u7684\u6a21\u5757\u5316\u8868\u793a<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u7ec7\u5165<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Weaving<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5c06Advice\u5e94\u7528\u5230\u76ee\u6807\u5bf9\u8c61\u7684\u8fc7\u7a0b<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/aspect-structure-diagram.svg'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/aspect-structure-diagram.svg\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\u5207\u9762\u7531\u5207\u5165\u70b9\u548c\u901a\u77e5\u7ec4\u6210\u7684\u7ed3\u6784\u56fe\"\/><\/div><figcaption class=\"wp-element-caption\">\u5207\u9762\u7531\u5207\u5165\u70b9\u548c\u901a\u77e5\u7ec4\u6210\u7684\u7ed3\u6784\u56fe<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1aAOP \u7684\u672f\u8bed\u5e76\u4e0d\u662f\u96f6\u6563\u8bb0\u5fc6\u7684\u540d\u8bcd\u8868\uff0c\u5b83\u4eec\u56f4\u7ed5\u201c\u76ee\u6807\u5bf9\u8c61\u88ab\u4ee3\u7406\u540e\uff0c\u589e\u5f3a\u903b\u8f91\u5982\u4f55\u547d\u4e2d\u5e76\u6267\u884c\u201d\u8fd9\u4e00\u6761\u94fe\u8def\u7ec4\u7ec7\u8d77\u6765\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring AOP\u5e95\u5c42\u539f\u7406<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-1-\u52a8\u6001\u4ee3\u7406\u5b9e\u73b0\">\u52a8\u6001\u4ee3\u7406\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AOP\u5728\u8fd0\u884c\u671f\u901a\u8fc7\u4ee3\u7406\u65b9\u5f0f\u5411\u76ee\u6807\u7c7b\u7ec7\u5165\u589e\u5f3a\u4ee3\u7801\uff0c\u6838\u5fc3\u539f\u7406\u662f<strong>\u52a8\u6001\u4ee3\u7406<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u4ee3\u7406\u7c7b\u793a\u610f\uff08\u975e\u771f\u5b9e\u4ee3\u7801\uff09\npublic class UserServiceProxy implements UserService {\n    private UserService target;  \/\/ \u76ee\u6807\u5bf9\u8c61\n    private LoggerAdvice advice; \/\/ \u589e\u5f3a\u903b\u8f91\n\n    public void createUser(String name) {\n        advice.before();                    \/\/ \u524d\u7f6e\u589e\u5f3a\n        target.createUser(name);            \/\/ \u8c03\u7528\u76ee\u6807\u65b9\u6cd5\n        advice.after();                     \/\/ \u540e\u7f6e\u589e\u5f3a\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-2-\u4e24\u79cd\u4ee3\u7406\u65b9\u5f0f\">3.2 \u4e24\u79cd\u4ee3\u7406\u65b9\u5f0f<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u4ee3\u7406\u65b9\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u9002\u7528\u573a\u666f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u7279\u70b9<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>JDK\u52a8\u6001\u4ee3\u7406<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u76ee\u6807\u7c7b\u5b9e\u73b0\u4e86\u63a5\u53e3<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u57fa\u4e8e\u63a5\u53e3\u751f\u6210\u4ee3\u7406<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>CGLIB\u4ee3\u7406<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u76ee\u6807\u7c7b\u6ca1\u6709\u63a5\u53e3<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u57fa\u4e8e\u5b50\u7c7b\u751f\u6210\u4ee3\u7406<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>JDK\u52a8\u6001\u4ee3\u7406:           CGLIB\u4ee3\u7406:\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  \u63a5\u53e3         \u2502       \u2502   \u76ee\u6807\u7c7b      \u2502\n\u2502  UserService  \u2502       \u2502 UserService  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502                      \u2502\n       \u2193                      \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   \u4ee3\u7406\u7c7b      \u2502       \u2502   \u5b50\u7c7b(\u4ee3\u7406)  \u2502\n\u2502 implements   \u2502       \u2502 extends      \u2502\n\u2502 UserService  \u2502       \u2502 UserService  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/image-20260503025514204.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"http:\/\/118.25.99.91\/courses\/markdown\/image\/11-Spring-AOP-optimized\/image-20260503025514204.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"image-20260503025514204\"\/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">JDK \u52a8\u6001\u4ee3\u7406\u7684\u6838\u5fc3\u662f\u00a0<code>implements \u63a5\u53e3<\/code>\uff0c\u800c CGLIB \u4ee3\u7406\u7684\u6838\u5fc3\u662f\u00a0<code>extends \u76ee\u6807\u7c7b<\/code>\u3002\u8fd9\u5f20\u56fe\u7684\u91cd\u70b9\u5728\u4e8e\u641e\u6e05\u695a\u4ee3\u7406\u5bf9\u8c61\u548c\u539f\u59cb\u5bf9\u8c61\u4e4b\u95f4\u5230\u5e95\u662f\u201c\u5b9e\u73b0\u540c\u4e00\u63a5\u53e3\u201d\u8fd8\u662f\u201c\u7ee7\u627f\u539f\u59cb\u7c7b\u578b\u201d\u7684\u5173\u7cfb\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1aSpring AOP \u4e0d\u662f\u4fee\u6539\u539f\u59cb\u7c7b\u6e90\u7801\uff0c\u800c\u662f\u5728\u8fd0\u884c\u671f\u751f\u6210\u4ee3\u7406\u5bf9\u8c61\uff0c\u628a\u589e\u5f3a\u903b\u8f91\u5305\u8fdb\u65b9\u6cd5\u8c03\u7528\u6d41\u7a0b\u91cc\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AOP\u5feb\u901f\u5165\u95e8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-1-\u6dfb\u52a0\u4f9d\u8d56\">\u6dfb\u52a0\u4f9d\u8d56<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-context&lt;\/artifactId&gt;\n    &lt;version&gt;6.2.15&lt;\/version&gt;\n&lt;\/dependency&gt;\n\n&lt;!-- AspectJ\u4f9d\u8d56\uff08Spring AOP\u4f7f\u7528\u4e86AspectJ\u7684\u5207\u70b9\u8868\u8fbe\u5f0f\uff09 --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.aspectj&lt;\/groupId&gt;\n    &lt;artifactId&gt;aspectjweaver&lt;\/artifactId&gt;\n    &lt;version&gt;1.9.9.1&lt;\/version&gt;\n&lt;\/dependency&gt;\n\n&lt;!-- \u6d4b\u8bd5\u9a8c\u8bc1\u9700\u8981\u7684Spring Test\u4e0eJUnit Jupiter --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-test&lt;\/artifactId&gt;\n    &lt;version&gt;6.2.15&lt;\/version&gt;\n    &lt;scope&gt;test&lt;\/scope&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.junit.jupiter&lt;\/groupId&gt;\n    &lt;artifactId&gt;junit-jupiter-api&lt;\/artifactId&gt;\n    &lt;version&gt;5.10.0&lt;\/version&gt;\n    &lt;scope&gt;test&lt;\/scope&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.junit.jupiter&lt;\/groupId&gt;\n    &lt;artifactId&gt;junit-jupiter-engine&lt;\/artifactId&gt;\n    &lt;version&gt;5.10.0&lt;\/version&gt;\n    &lt;scope&gt;test&lt;\/scope&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-2-\u5f00\u542faop\u529f\u80fd\">\u5f00\u542fAOP\u529f\u80fd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5207\u9762\u7ec4\u4ef6<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u589e\u52a0AspectJ\u7684\u6ce8\u89e3\u5f00\u5173 \u2192 \u914d\u7f6e\u7c7b\u4e0a\u589e\u52a0\u4e00\u4e2a\u6ce8\u89e3<strong>@EnableAspectJAutoProxy<\/strong><\/li>\n\n\n\n<li>\u628a\u7ec4\u4ef6\u6807\u8bb0\u4e3a\u5207\u9762\u7ec4\u4ef6 \u2192\u00a0<strong>@Aspect<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\n@ComponentScan(\"com.example\")\n@EnableAspectJAutoProxy  \/\/ \u5f00\u542fSpring AOP\npublic class SpringConfiguration {\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-3-\u5b9a\u4e49\u5207\u9762\">\u5b9a\u4e49\u5207\u9762<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component  \/\/ \u6ce8\u518c\u4e3aSpring Bean\n@Aspect     \/\/ \u6807\u8bb0\u4e3a\u5207\u9762\u7c7b\npublic class LoggingAspect {\n\n    \/\/ \u5b9a\u4e49\u5207\u5165\u70b9\uff1a\u5339\u914dcom.example.service\u5305\u4e0b\u6240\u6709\u7c7b\u7684\u6240\u6709\u65b9\u6cd5\n    @Pointcut(\"execution(* com.example.service.*.*(..))\")\n    public void servicePointCut() {}\n\n    \/\/ \u524d\u7f6e\u901a\u77e5\uff1a\u65b9\u6cd5\u6267\u884c\u524d\u6267\u884c\n    @Before(\"servicePointCut()\")\n    public void beforeLog(JoinPoint joinPoint) {\n        System.out.println(\"&#91;\u65e5\u5fd7] \u5f00\u59cb\u6267\u884c: \" + joinPoint.getSignature().getName());\n    }\n\n    \/\/ \u540e\u7f6e\u901a\u77e5\uff1a\u65b9\u6cd5\u6267\u884c\u540e\u6267\u884c\n    @After(\"servicePointCut()\")\n    public void afterLog(JoinPoint joinPoint) {\n        System.out.println(\"&#91;\u65e5\u5fd7] \u6267\u884c\u7ed3\u675f: \" + joinPoint.getSignature().getName());\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-4-\u6548\u679c\u9a8c\u8bc1\">\u6548\u679c\u9a8c\u8bc1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@ExtendWith(SpringExtension.class)\n@ContextConfiguration(classes = SpringConfiguration.class)\npublic class AopTest {\n\n    @Autowired\n    private UserService userService;\n\n    @Test\n    public void testAop() {\n        userService.createUser(\"\u5f20\u4e09\");\n        \/\/ \u8f93\u51fa\uff1a\n        \/\/ &#91;\u65e5\u5fd7] \u5f00\u59cb\u6267\u884c: createUser\n        \/\/ \u4e1a\u52a1\u903b\u8f91\uff1a\u521b\u5efa\u7528\u6237\n        \/\/ &#91;\u65e5\u5fd7] \u6267\u884c\u7ed3\u675f: createUser\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" id=\"\u672c\u7ae0\u5c0f\u7ed3-4\"><strong>\u6982\u5ff5<\/strong>\uff1aAOP \u7684\u5165\u95e8\u914d\u7f6e\u5176\u5b9e\u5c31\u662f\u628a\u201c\u4f9d\u8d56\u3001\u5f00\u5173\u3001\u5207\u9762\u7c7b\u3001\u5207\u5165\u70b9\u3001\u901a\u77e5\u65b9\u6cd5\u201d\u8fd9\u51e0\u5757\u62fc\u8d77\u6765\uff0c\u8ba9 Spring \u77e5\u9053\u8be5\u5728\u4ec0\u4e48\u4f4d\u7f6e\u7ec7\u5165\u4ec0\u4e48\u903b\u8f91\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5207\u5165\u70b9\u8868\u8fbe\u5f0f\uff08PointCut\uff09<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-1-execution\u8868\u8fbe\u5f0f\">execution\u8868\u8fbe\u5f0f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5e38\u7528\uff0c\u7528\u4e8e\u76f4\u63a5\u5339\u914d\u65b9\u6cd5\u7b7e\u540d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8bed\u6cd5<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>execution(\u8bbf\u95ee\u4fee\u9970\u7b26 \u8fd4\u56de\u503c \u5305\u540d.\u7c7b\u540d.\u65b9\u6cd5\u540d(\u53c2\u6570\u5217\u8868))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u901a\u914d\u7b26<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>*<\/code>\uff1a\u5339\u914d\u4efb\u610f\u5b57\u7b26\uff08\u5355\u4e2a\uff09<\/li>\n\n\n\n<li><code>..<\/code>\uff1a\u5339\u914d\u4efb\u610f\u5b57\u7b26\uff08\u591a\u4e2a\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u793a\u4f8b<\/strong>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u8868\u8fbe\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u542b\u4e49<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(public&nbsp;<em><\/em>(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4efb\u610fpublic\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;set<\/em>(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4efb\u610f\u4ee5set\u5f00\u5934\u7684\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;com.service.<\/em>.*(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">service\u5305\u4e0b\u4efb\u610f\u7c7b\u7684\u4efb\u610f\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;com.service..<\/em>.*(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">service\u5305\u53ca\u5176\u5b50\u5305\u4e0b\u4efb\u610f\u7c7b\u7684\u4efb\u610f\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;com.service.UserService.<\/em>(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">UserService\u63a5\u53e3\u7684\u6240\u6709\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;com.service.<\/em>.create*(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">service\u5305\u4e0b\u4efb\u610f\u7c7b\u4ee5create\u5f00\u5934\u7684\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(String com.service.<em>.find<\/em>(..))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8fd4\u56de\u503c\u4e3aString\u4e14\u4ee5find\u5f00\u5934\u7684\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution(<em>&nbsp;com.service.<\/em>.<em>(String,&nbsp;<\/em>))<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7b2c\u4e00\u4e2a\u53c2\u6570\u4e3aString\uff0c\u7b2c\u4e8c\u4e2a\u4e3a\u4efb\u610f\u7c7b\u578b<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-2-annotation\u8868\u8fbe\u5f0f\">@annotation\u8868\u8fbe\u5f0f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5339\u914d\u6807\u6ce8\u4e86\u6307\u5b9a\u6ce8\u89e3\u7684\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 1. \u5b9a\u4e49\u6ce8\u89e3\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface LogOperation {\n}\n\n\/\/ 2. \u4f7f\u7528\u6ce8\u89e3\n@Service\npublic class UserServiceImpl {\n    @LogOperation\n    public void createUser(String name) {\n        \/\/ ...\n    }\n}\n\n\/\/ 3. \u5b9a\u4e49\u5207\u5165\u70b9\n@Pointcut(\"@annotation(com.example.annotation.LogOperation)\")\npublic void logPointCut() {}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-3-target\u8868\u8fbe\u5f0f\">@target\u8868\u8fbe\u5f0f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5339\u914d\u76ee\u6807\u5bf9\u8c61\u7c7b\u4e0a\u6807\u6ce8\u4e86\u6307\u5b9a\u6ce8\u89e3\u7684\u65b9\u6cd5\uff08\u7c7b\u7ea7\u522b\u7684\u6ce8\u89e3\uff09\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 1. \u5b9a\u4e49\u7c7b\u7ea7\u522b\u6ce8\u89e3\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.TYPE)\npublic @interface ServiceLog {\n}\n\n\/\/ 2. \u6807\u6ce8\u5728\u7c7b\u4e0a\n@Service\n@ServiceLog\npublic class UserServiceImpl {\n    public void createUser(String name) { }  \/\/ \u4f1a\u88ab\u5339\u914d\n    public void deleteUser(String name) { }  \/\/ \u4e5f\u4f1a\u88ab\u5339\u914d\n}\n\n\/\/ 3. \u5b9a\u4e49\u5207\u5165\u70b9\n@Pointcut(\"@target(com.example.annotation.ServiceLog)\")\npublic void serviceLogPointCut() {}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-4-\u8868\u8fbe\u5f0f\u5bf9\u6bd4\">\u8868\u8fbe\u5f0f\u5bf9\u6bd4<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u8868\u8fbe\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u5339\u914d\u7c92\u5ea6<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f7f\u7528\u573a\u666f<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>execution<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u7b7e\u540d<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6309\u5305\u3001\u7c7b\u3001\u65b9\u6cd5\u540d\u5339\u914d<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@annotation<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u6ce8\u89e3<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7cbe\u786e\u63a7\u5236\u54ea\u4e9b\u65b9\u6cd5\u9700\u8981\u589e\u5f3a<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@target<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7c7b\u6ce8\u89e3<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5bf9\u6574\u4e2a\u7c7b\u7684\u6240\u6709\u65b9\u6cd5\u589e\u5f3a<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1a\u5207\u5165\u70b9\u8868\u8fbe\u5f0f\u7684\u5173\u952e\u4e0d\u662f\u6b7b\u8bb0\u8bed\u6cd5\uff0c\u800c\u662f\u6839\u636e\u4e1a\u52a1\u9700\u8981\u9009\u62e9\u201c\u6309\u65b9\u6cd5\u7b7e\u540d\u62e6\u622a\u201d\u8fd8\u662f\u201c\u6309\u6ce8\u89e3\u62e6\u622a\u201d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u901a\u77e5\u7c7b\u578b\uff08Advice\uff09<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-1-5\u79cd\u901a\u77e5\u7c7b\u578b\">5\u79cd\u901a\u77e5\u7c7b\u578b<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u901a\u77e5\u7c7b\u578b<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u6ce8\u89e3<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u6267\u884c\u65f6\u673a<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u7279\u70b9<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u524d\u7f6e\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">@Before<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u6267\u884c\u524d<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65e0\u6cd5\u963b\u6b62\u65b9\u6cd5\u6267\u884c<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u540e\u7f6e\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">@AfterReturning<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u6b63\u5e38\u8fd4\u56de\u540e<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u83b7\u53d6\u8fd4\u56de\u503c<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u5f02\u5e38\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">@AfterThrowing<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u629b\u51fa\u5f02\u5e38\u540e<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u83b7\u53d6\u5f02\u5e38\u5bf9\u8c61<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u6700\u7ec8\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">@After<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u6267\u884c\u7ed3\u675f\u540e<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65e0\u8bba\u6b63\u5e38\u6216\u5f02\u5e38<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>\u73af\u7ed5\u901a\u77e5<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">@Around<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5\u6267\u884c\u524d\u540e<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6700\u5f3a\u63a7\u5236\u529b\uff0c\u53ef\u63a7\u5236\u662f\u5426\u6267\u884c\u76ee\u6807\u65b9\u6cd5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-2-\u6267\u884c\u987a\u5e8f\">\u6267\u884c\u987a\u5e8f<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\u6b63\u5e38\u6267\u884c\u6d41\u7a0b\uff1a\n@Before \u2192 \u76ee\u6807\u65b9\u6cd5 \u2192 @AfterReturning \u2192 @After\n\n\u5f02\u5e38\u6267\u884c\u6d41\u7a0b\uff1a\n@Before \u2192 \u76ee\u6807\u65b9\u6cd5(\u629b\u51fa\u5f02\u5e38) \u2192 @AfterThrowing \u2192 @After<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-3-\u5404\u7c7b\u901a\u77e5\u8be6\u89e3\">\u5404\u7c7b\u901a\u77e5\u8be6\u89e3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Before\uff08\u524d\u7f6e\u901a\u77e5\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Before(\"servicePointCut()\")\npublic void beforeAdvice(JoinPoint joinPoint) {\n    \/\/ \u83b7\u53d6\u65b9\u6cd5\u7b7e\u540d\n    String methodName = joinPoint.getSignature().getName();\n    \/\/ \u83b7\u53d6\u53c2\u6570\n    Object&#91;] args = joinPoint.getArgs();\n    \/\/ \u83b7\u53d6\u76ee\u6807\u5bf9\u8c61\n    Object target = joinPoint.getTarget();\n\n    System.out.println(\"&#91;\u524d\u7f6e\u901a\u77e5] \u51c6\u5907\u6267\u884c: \" + methodName);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@AfterReturning\uff08\u8fd4\u56de\u901a\u77e5\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@AfterReturning(\n    value = \"servicePointCut()\",\n    returning = \"result\"  \/\/ \u7ed1\u5b9a\u8fd4\u56de\u503c\u5230\u53c2\u6570\n)\npublic void afterReturning(JoinPoint joinPoint, Object result) {\n    System.out.println(\"&#91;\u8fd4\u56de\u901a\u77e5] \u8fd4\u56de\u503c: \" + result);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@AfterThrowing\uff08\u5f02\u5e38\u901a\u77e5\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@AfterThrowing(\n    value = \"servicePointCut()\",\n    throwing = \"ex\"  \/\/ \u7ed1\u5b9a\u5f02\u5e38\u5230\u53c2\u6570\n)\npublic void afterThrowing(JoinPoint joinPoint, Exception ex) {\n    System.out.println(\"&#91;\u5f02\u5e38\u901a\u77e5] \u53d1\u751f\u5f02\u5e38: \" + ex.getMessage());\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@After\uff08\u6700\u7ec8\u901a\u77e5\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@After(\"servicePointCut()\")\npublic void afterAdvice(JoinPoint joinPoint) {\n    System.out.println(\"&#91;\u6700\u7ec8\u901a\u77e5] \u65b9\u6cd5\u6267\u884c\u7ed3\u675f\");\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Around\uff08\u73af\u7ed5\u901a\u77e5\uff09<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6700\u5f3a\u5927\u7684\u901a\u77e5\u7c7b\u578b\uff0c\u53ef\u4ee5\u63a7\u5236\u76ee\u6807\u65b9\u6cd5\u662f\u5426\u6267\u884c<\/strong>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Around(\"servicePointCut()\")\npublic Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {\n    \/\/ 1. \u524d\u7f6e\u903b\u8f91\n    System.out.println(\"&#91;\u73af\u7ed5\u901a\u77e5-\u524d]\");\n\n    \/\/ 2. \u83b7\u53d6\u4fe1\u606f\n    String methodName = joinPoint.getSignature().getName();\n    Object&#91;] args = joinPoint.getArgs();\n\n    Object result = null;\n    try {\n        \/\/ 3. \u6267\u884c\u76ee\u6807\u65b9\u6cd5\uff08\u5982\u679c\u4e0d\u8c03\u7528proceed\uff0c\u76ee\u6807\u65b9\u6cd5\u4e0d\u4f1a\u6267\u884c\uff09\n        result = joinPoint.proceed(args);\n\n        \/\/ 4. \u540e\u7f6e\u903b\u8f91\uff08\u6b63\u5e38\u8fd4\u56de\uff09\n        System.out.println(\"&#91;\u73af\u7ed5\u901a\u77e5-\u540e] \u8fd4\u56de\u503c: \" + result);\n    } catch (Throwable e) {\n        \/\/ 5. \u5f02\u5e38\u5904\u7406\n        System.out.println(\"&#91;\u73af\u7ed5\u901a\u77e5-\u5f02\u5e38] \" + e.getMessage());\n        throw e;\n    } finally {\n        \/\/ 6. \u6700\u7ec8\u903b\u8f91\n        System.out.println(\"&#91;\u73af\u7ed5\u901a\u77e5-\u6700\u7ec8]\");\n    }\n\n    return result;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-4-\u901a\u77e5\u9009\u62e9\u6307\u5357\">\u901a\u77e5\u9009\u62e9\u6307\u5357<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\n  \u8bb0\u5f55\u65e5\u5fd7\/\u6743\u9650\u68c0\u67e5\uff08\u4e0d\u5173\u5fc3\u7ed3\u679c\uff09      \u2192 @Before   \n  \u8bb0\u5f55\u8fd4\u56de\u503c\/\u7ed3\u679c\u5904\u7406                 \u2192 @AfterReturning \n  \u5f02\u5e38\u5904\u7406\/\u544a\u8b66                       \u2192 @AfterThrowing  \n  \u8d44\u6e90\u6e05\u7406\uff08\u5fc5\u987b\u6267\u884c\uff09                \u2192 @After    \n  \u4e8b\u52a1\u63a7\u5236\/\u6027\u80fd\u76d1\u63a7\uff08\u5b8c\u5168\u63a7\u5236\uff09       \u2192 @Around   \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1a\u4e0d\u540c\u901a\u77e5\u7c7b\u578b\u7684\u5dee\u5f02\uff0c\u672c\u8d28\u4e0a\u662f\u201c\u5b83\u4eec\u80fd\u4ecb\u5165\u76ee\u6807\u65b9\u6cd5\u6267\u884c\u6d41\u7a0b\u7684\u54ea\u4e2a\u9636\u6bb5\u3001\u80fd\u62ff\u5230\u54ea\u4e9b\u4fe1\u606f\u3001\u80fd\u63a7\u5236\u5230\u4ec0\u4e48\u7a0b\u5ea6\u201d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JoinPoint\u4e0eProceedingJoinPoint<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"7-1-joinpoint-api\">JoinPoint API<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface JoinPoint {\n    \/\/ \u83b7\u53d6\u65b9\u6cd5\u7b7e\u540d\uff08\u5305\u542b\u65b9\u6cd5\u540d\u3001\u53c2\u6570\u7c7b\u578b\u7b49\uff09\n    Signature getSignature();\n\n    \/\/ \u83b7\u53d6\u76ee\u6807\u5bf9\u8c61\uff08\u88ab\u4ee3\u7406\u7684\u539f\u59cb\u5bf9\u8c61\uff09\n    Object getTarget();\n\n    \/\/ \u83b7\u53d6\u4ee3\u7406\u5bf9\u8c61\n    Object getThis();\n\n    \/\/ \u83b7\u53d6\u65b9\u6cd5\u53c2\u6570\n    Object&#91;] getArgs();\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"7-2-proceedingjoinpoint-\u73af\u7ed5\u901a\u77e5\u4e13\u7528\">ProceedingJoinPoint\uff08\u73af\u7ed5\u901a\u77e5\u4e13\u7528\uff09<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface ProceedingJoinPoint extends JoinPoint {\n    \/\/ \u6267\u884c\u76ee\u6807\u65b9\u6cd5\n    Object proceed() throws Throwable;\n\n    \/\/ \u5e26\u53c2\u6570\u6267\u884c\u76ee\u6807\u65b9\u6cd5\n    Object proceed(Object&#91;] args) throws Throwable;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"7-3-\u4f7f\u7528\u793a\u4f8b\">\u4f7f\u7528\u793a\u4f8b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Around(\"servicePointCut()\")\npublic Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {\n    \/\/ \u65b9\u6cd5\u4fe1\u606f\n    String className = joinPoint.getTarget().getClass().getSimpleName();\n    String methodName = joinPoint.getSignature().getName();\n    Object&#91;] args = joinPoint.getArgs();\n\n    \/\/ \u8bb0\u5f55\u5165\u53c2\n    System.out.println(\"&#91;\" + className + \".\" + methodName + \"] \u5165\u53c2: \" + Arrays.toString(args));\n\n    long startTime = System.currentTimeMillis();\n\n    \/\/ \u6267\u884c\u76ee\u6807\u65b9\u6cd5\n    Object result = joinPoint.proceed();\n\n    long endTime = System.currentTimeMillis();\n\n    \/\/ \u8bb0\u5f55\u51fa\u53c2\u548c\u6267\u884c\u65f6\u95f4\n    System.out.println(\"&#91;\" + className + \".\" + methodName + \"] \u51fa\u53c2: \" + result + \" \u8017\u65f6: \" + (endTime - startTime) + \"ms\");\n\n    return result;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" id=\"\u672c\u7ae0\u5c0f\u7ed3-7\"><strong>\u6838\u5fc3\u6982\u5ff5<\/strong>\uff1aJoinPoint \u8d1f\u8d23\u63d0\u4f9b\u65b9\u6cd5\u6267\u884c\u65f6\u7684\u4e0a\u4e0b\u6587\uff0cProceedingJoinPoint \u5219\u5728\u6b64\u57fa\u7840\u4e0a\u8fdb\u4e00\u6b65\u63d0\u4f9b\u4e86\u5bf9\u76ee\u6807\u65b9\u6cd5\u6267\u884c\u8fc7\u7a0b\u7684\u63a7\u5236\u80fd\u529b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6838\u5fc3\u6ce8\u89e3\u901f\u67e5\u8868<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u6ce8\u89e3<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f7f\u7528\u4f4d\u7f6e<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@EnableAspectJAutoProxy<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5f00\u542fAOP\u529f\u80fd<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u914d\u7f6e\u7c7b<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@Aspect<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6807\u8bb0\u5207\u9762\u7c7b<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7c7b<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@Pointcut<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5b9a\u4e49\u5207\u5165\u70b9<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@Before<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u524d\u7f6e\u901a\u77e5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@AfterReturning<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8fd4\u56de\u901a\u77e5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@AfterThrowing<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5f02\u5e38\u901a\u77e5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@After<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6700\u7ec8\u901a\u77e5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@Around<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u73af\u7ed5\u901a\u77e5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u65b9\u6cd5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>AOP\u6982\u8ff0 \u4ec0\u4e48\u662fAOP AOP\uff08Aspect-oriented Programming\uff09&nbsp;\u662f\u9762\u5411\u5207 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[18,17],"class_list":["post-245","post","type-post","status-publish","format-standard","hentry","category-learn","tag-spring","tag-17"],"_links":{"self":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/comments?post=245"}],"version-history":[{"count":2,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/245\/revisions"}],"predecessor-version":[{"id":247,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/245\/revisions\/247"}],"wp:attachment":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/media?parent=245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/categories?post=245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/tags?post=245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}