Spring中的AOP怎么理解 Spring的AOP如何理解,在业务里的作用是什么?
\u5982\u4f55\u7406\u89e3Spring\u7684AOP\uff1fSpring\u7684AOP\u9762\u5411\u5207\u9762\u7f16\u7a0b\uff0c\u5c31\u662f\u6a2a\u5411\u7684\uff0c\u6bd4\u5982\u7a0b\u5e8f\u8fd0\u884c\u65f6\u90fd\u8981\u5efa\u65e5\u5fd7\uff0c\u76f8\u5f53\u4e8eSQL\u7684\u89e6\u53d1\u5668\u3002
Spring\u662f\u4e00\u4e2a\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u8bbe\u8ba1\u5c42\u9762\u6846\u67b6\uff0c\u4ed6\u89e3\u51b3\u7684\u662f\u4e1a\u52a1\u903b\u8f91\u5c42\u548c\u5176\u4ed6\u5404\u5c42\u7684\u677e\u8026\u5408\u95ee\u9898\uff0c\u56e0\u6b64\u5b83\u5c06\u9762\u5411\u63a5\u53e3\u7684\u7f16\u7a0b\u601d\u60f3\u8d2f\u7a7f\u6574\u4e2a\u7cfb\u7edf\u5e94\u7528\u3002Spring\u662f\u4e8e2003 \u5e74\u5174\u8d77\u7684\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684Java \u5f00\u53d1\u6846\u67b6\uff0c\u7531Rod Johnson\u521b\u5efa\u3002\u7b80\u5355\u6765\u8bf4\uff0cSpring\u662f\u4e00\u4e2a\u5206\u5c42\u7684JavaSE/EEfull-stack(\u4e00\u7ad9\u5f0f) \u8f7b\u91cf\u7ea7\u5f00\u6e90\u6846\u67b6\u3002
Spring\u7279\u70b9\uff1a
1\u3001\u65b9\u4fbf\u89e3\u8026\uff0c\u7b80\u5316\u5f00\u53d1
\u901a\u8fc7Spring\u63d0\u4f9b\u7684IoC\u5bb9\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5bf9\u8c61\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u4ea4\u7531Spring\u8fdb\u884c\u63a7\u5236\uff0c\u907f\u514d\u786c\u7f16\u7801\u6240\u9020\u6210\u7684\u8fc7\u5ea6\u7a0b\u5e8f\u8026\u5408\u3002\u6709\u4e86Spring\uff0c\u7528\u6237\u4e0d\u5fc5\u518d\u4e3a\u5355\u5b9e\u4f8b\u6a21\u5f0f\u7c7b\u3001\u5c5e\u6027\u6587\u4ef6\u89e3\u6790\u7b49\u8fd9\u4e9b\u5f88\u5e95\u5c42\u7684\u9700\u6c42\u7f16\u5199\u4ee3\u7801\uff0c\u53ef\u4ee5\u66f4\u4e13\u6ce8\u4e8e\u4e0a\u5c42\u7684\u5e94\u7528\u3002
2\u3001AOP\u7f16\u7a0b\u7684\u652f\u6301
\u901a\u8fc7Spring\u63d0\u4f9b\u7684AOP\u529f\u80fd\uff0c\u65b9\u4fbf\u8fdb\u884c\u9762\u5411\u5207\u9762\u7684\u7f16\u7a0b\uff0c\u8bb8\u591a\u4e0d\u5bb9\u6613\u7528\u4f20\u7edfOOP\u5b9e\u73b0\u7684\u529f\u80fd\u53ef\u4ee5\u901a\u8fc7AOP\u8f7b\u677e\u5e94\u4ed8\u3002
3\u3001\u58f0\u660e\u5f0f\u4e8b\u52a1\u7684\u652f\u6301
\u5728Spring\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4ece\u5355\u8c03\u70e6\u95f7\u7684\u4e8b\u52a1\u7ba1\u7406\u4ee3\u7801\u4e2d\u89e3\u8131\u51fa\u6765\uff0c\u901a\u8fc7\u58f0\u660e\u5f0f\u65b9\u5f0f\u7075\u6d3b\u5730\u8fdb\u884c\u4e8b\u52a1\u7684\u7ba1\u7406\uff0c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u548c\u8d28\u91cf\u3002
4\u3001\u65b9\u4fbf\u7a0b\u5e8f\u7684\u6d4b\u8bd5
\u53ef\u4ee5\u7528\u975e\u5bb9\u5668\u4f9d\u8d56\u7684\u7f16\u7a0b\u65b9\u5f0f\u8fdb\u884c\u51e0\u4e4e\u6240\u6709\u7684\u6d4b\u8bd5\u5de5\u4f5c\uff0c\u5728Spring\u91cc\uff0c\u6d4b\u8bd5\u4e0d\u518d\u662f\u6602\u8d35\u7684\u64cd\u4f5c\uff0c\u800c\u662f\u968f\u624b\u53ef\u505a\u7684\u4e8b\u60c5\u3002\u4f8b\u5982:Spring\u5bf9Junit4\u652f\u6301\uff0c\u53ef\u4ee5\u901a\u8fc7\u6ce8\u89e3\u65b9\u4fbf\u7684\u6d4b\u8bd5Spring\u7a0b\u5e8f\u3002
5\u3001\u65b9\u4fbf\u96c6\u6210\u5404\u79cd\u4f18\u79c0\u6846\u67b6
Spring\u4e0d\u6392\u65a5\u5404\u79cd\u4f18\u79c0\u7684\u5f00\u6e90\u6846\u67b6\uff0c\u76f8\u53cd\uff0cSpring\u53ef\u4ee5\u964d\u4f4e\u5404\u79cd\u6846\u67b6\u7684\u4f7f\u7528\u96be\u5ea6\uff0cSpring\u63d0\u4f9b\u4e86\u5bf9\u5404\u79cd\u4f18\u79c0\u6846\u67b6(\u5982Struts,Hibernate\u3001Hessian\u3001Quartz)\u7b49\u7684\u76f4\u63a5\u652f\u6301\u3002
6\u3001\u964d\u4f4eJava EE API\u7684\u4f7f\u7528\u96be\u5ea6
Spring\u5bf9\u5f88\u591a\u96be\u7528\u7684Java EE API(\u5982JDBC\uff0cJavaMail\uff0c\u8fdc\u7a0b\u8c03\u7528\u7b49)\u63d0\u4f9b\u4e86\u4e00\u4e2a\u8584\u8584\u7684\u5c01\u88c5\u5c42\uff0c\u901a\u8fc7Spring\u7684\u7b80\u6613\u5c01\u88c5\uff0c\u8fd9\u4e9bJava EE API\u7684\u4f7f\u7528\u96be\u5ea6\u5927\u4e3a\u964d\u4f4e\u3002
7\u3001Java \u6e90\u7801\u662f\u7ecf\u5178\u5b66\u4e60\u8303\u4f8b
Spring\u7684\u6e90\u7801\u8bbe\u8ba1\u7cbe\u5999\u3001\u7ed3\u6784\u6e05\u6670\u3001\u5320\u5fc3\u72ec\u8fd0\uff0c\u5904\u5904\u4f53\u73b0\u7740\u5927\u5e08\u5bf9Java\u8bbe\u8ba1\u6a21\u5f0f\u7075\u6d3b\u8fd0\u7528\u4ee5\u53ca\u5bf9Java\u6280\u672f\u7684\u9ad8\u6df1\u9020\u8be3\u3002Spring\u6846\u67b6\u6e90\u7801\u65e0\u7591\u662fJava\u6280\u672f\u7684\u6700\u4f73\u5b9e\u8df5\u8303\u4f8b\u3002\u5982\u679c\u60f3\u5728\u77ed\u65f6\u95f4\u5185\u8fc5\u901f\u63d0\u9ad8\u81ea\u5df1\u7684Java\u6280\u672f\u6c34\u5e73\u548c\u5e94\u7528\u5f00\u53d1\u6c34\u5e73\uff0c\u5b66\u4e60\u548c\u7814\u7a76Spring\u6e90\u7801\u5c06\u4f1a\u4f7f\u4f60\u6536\u5230\u610f\u60f3\u4e0d\u5230\u7684\u6548\u679c\u3002
\u6709\u4e2a\u7b80\u5355\u7684\u7406\u89e3\uff0c\u5c31\u662f\u5728\u522b\u4eba\u505a\u597d\u7684\u7a0b\u5e8f\u5916\u9762\u53ef\u4ee5\u5957\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u6bd4\u5982\u4ee5\u524d\u7684\u7a0b\u5e8f\u5458\u505a\u5b8c\u4e86\u4e00\u4e2a\u65b9\u6cd5A(),\u540e\u6765\u4ed6\u79bb\u804c\u6216\u8c03\u8d70\u4e86\uff0c\u4f60\u4e5f\u6ca1\u6709\u6e90\u4ee3\u7801\uff0c\u4f46\u73b0\u5728\u4e1a\u52a1\u8981\u6c42\u5728\u6267\u884c\u8fd9\u4e2a\u65b9\u6cd5\u65f6\u8981\u5199\u4e00\u4e2a\u65e5\u5fd7\u4fe1\u606f\uff0c\u90a3\u4e48\u4f60\u5c31\u7528AOP\u6765\u5b9e\u73b0\uff0c\u5b9e\u73b0AOP\u7684\u67d0\u4e9b\u63a5\u53e3\uff0c\u5f53\u65b9\u6cd5A\u88ab\u6267\u884c\u7684\u65f6\u5019\u5c31\u4f1a\u89e6\u53d1\u4f60\u505a\u7684\u5199\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u7c7b\u4f3c\u6570\u636e\u5e93\u7684\u89e6\u53d1\u5668\uff0c\u8fd9\u6837\u505a\u7684\u597d\u5904\u65f6\u539f\u6765\u505a\u7684\u65b9\u6cd5A()\u4e0d\u7528\u505a\u4efb\u4f55\u4fee\u6539\uff0c\u5b83\u751a\u81f3\u4e0d\u77e5\u9053\u6709\u8fd9\u4e48\u56de\u4e8b\uff0c\u800c\u4f60\u7684\u7a0b\u5e8f\u53c8\u53ef\u4ee5\u57fa\u4e8e\u5b83\u7684\u8fd0\u884c\u7ed3\u679c\u7b49\u5b9e\u73b0\u4f60\u7684\u529f\u80fd\u9700\u6c42\uff0c\u8fbe\u5230\u89e3\u8026\u7684\u76ee\u7684\u3002
最简单的例子,做一个数据删除操作要求写日志没有AOP的情况:
1.删除数据代码
2.添加日志代码
有AOP:
(添加日志(删除数据))
等于就是你不再需要手动写添加日志的代码了,相当于把删除数据的代码放入了一个切面中,它自己会触发添加日志的代码
aop的中文意思是面向切面编程。
之前java中有面向过程编程、面向对象编程(oop)
这里aop可以为某一类对象进行监督和控制从而达到对这个模块扩充的功能。这些都是通过配置类来实现。
绛旓細Spring鐨凙OP闈㈠悜鍒囬潰缂栫▼锛屽氨鏄í鍚戠殑锛屾瘮濡傜▼搴忚繍琛屾椂閮借寤烘棩蹇楋紝鐩稿綋浜嶴QL鐨勮Е鍙戝櫒銆係pring鏄竴涓紑鏀炬簮浠g爜鐨勮璁″眰闈㈡鏋讹紝浠栬В鍐崇殑鏄笟鍔¢昏緫灞傚拰鍏朵粬鍚勫眰鐨勬澗鑰﹀悎闂锛屽洜姝ゅ畠灏嗛潰鍚戞帴鍙g殑缂栫▼鎬濇兂璐┛鏁翠釜绯荤粺搴旂敤銆係pring鏄簬2003 骞村叴璧风殑涓涓交閲忕骇鐨凧ava 寮鍙戞鏋讹紝鐢盧od Johnson鍒涘缓銆傜畝鍗曟潵璇...
绛旓細Spring涓殑AOP锛鍗抽潰鍚戝垏闈㈢紪绋嬶紝閫氳繃棰勭紪璇戞柟寮忓拰杩愯鏈熷姩鎬佷唬鐞嗗疄鐜扮▼搴忓姛鑳界殑缁熶竴缁存姢鐨勪竴绉嶆妧鏈銆AOP鏄疧OP鐨勫欢缁锛屾槸杞欢寮鍙戜腑鐨勪竴涓儹鐐癸紝涔熸槸Spring妗嗘灦涓殑涓涓噸瑕佸唴瀹癸紝鏄嚱鏁板紡缂栫▼鐨勪竴绉嶈鐢熻寖鍨嬨傚埄鐢ˋOP鍙互瀵逛笟鍔¢昏緫鐨勫悇涓儴鍒嗚繘琛岄殧绂伙紝浠庤屼娇寰椾笟鍔¢昏緫鍚勯儴鍒嗕箣闂寸殑鑰﹀悎搴﹂檷浣庯紝鎻愰珮绋嬪簭鐨勫彲...
绛旓細鏈堿OP锛氾紙娣诲姞鏃ュ織锛堝垹闄ゆ暟鎹級锛夌瓑浜庡氨鏄綘涓嶅啀闇瑕佹墜鍔ㄥ啓娣诲姞鏃ュ織鐨勪唬鐮佷簡锛岀浉褰撲簬鎶婂垹闄ゆ暟鎹殑浠g爜鏀惧叆浜嗕竴涓垏闈腑锛屽畠鑷繁浼氳Е鍙戞坊鍔犳棩蹇楃殑浠g爜
绛旓細spring鐨APO鏄寚闈㈠悜鍒囬潰缂栫▼锛屽畠鐨勪富瑕佸疄鐜板師鐞嗕富瑕佷袱绉嶃 1. 閫氳繃Java鍔ㄦ佷唬鐞嗭紙鍙嶅皠锛夋満鍒讹紝鍦ㄨ鎵ц鐨勬柟娉曞墠鍚庯紝鍔犱笂浜嬪姟鎺у埗鎴栨棩蹇椼2. 閫氳繃淇敼Java瀛楄妭鐮佺殑鏂瑰紡锛屼慨鏀逛綘缂栬瘧濂界殑绫伙紝鍦ㄨ鎵ц鐨勬柟娉曞墠鍚庯紝鍔犱笂浜嬪姟鎺у埗鎴栨棩蹇椼 閫氱煡銆佸垏鍏ョ偣绛夊叾瀹炲氨鏄敤鏉ラ厤缃湪浠涔堢被銆佷粈涔堜綅缃潵鎵ц銆佹墽琛屼粈...
绛旓細鍒囬潰缂栫▼锛屽氨鏄湪浣犻」鐩師鏈鐨鍔熻兘鍩虹涓婏紝閫氳繃AOP鍘绘坊鍔犳柊鐨勫姛鑳斤紝杩欎簺鍔熻兘鏄缓绔嬪湪鍘熸湁鍔熻兘鐨勫熀纭涓婄殑锛岃屼笖鍘熸湁鐨勫姛鑳藉苟涓嶇煡閬撲綘宸茬粡娣诲姞浜嗘柊鐨勫姛鑳姐傛瘮濡傝锛屼綘鍘籄TM鍙栭挶锛屽彇閽辨槸涓涓姛鑳斤紝鍙栧畬閽卞悗鍚戜綘鐨勬墜鏈哄彂閫佷竴鏉″彇閽变俊鎭紝杩欏氨鏄柊鍔犵殑鍔熻兘銆
绛旓細Spring鏄釜妗嗘灦锝為潰鍚戝垏闈㈢紪绋嬶細Aspect Oriented Programming AOP鏄疧OP鐨勫欢缁锛屾槸锛圓spect Oriented Programming锛夌殑缂╁啓锛屾剰鎬濇槸闈㈠悜鍒囬潰缂栫▼銆備富瑕佺殑鍔熻兘鏄細鏃ュ織璁板綍锛屾ц兘缁熻锛屽畨鍏ㄦ帶鍒讹紝浜嬪姟澶勭悊锛屽紓甯稿鐞嗙瓑绛夈備富瑕佺殑鎰忓浘鏄細灏嗘棩蹇楄褰曪紝鎬ц兘缁熻锛屽畨鍏ㄦ帶鍒讹紝浜嬪姟澶勭悊锛屽紓甯稿鐞嗙瓑浠g爜浠庝笟鍔¢昏緫浠g爜涓垝鍒...
绛旓細AOP浠g悊锛圓OP Proxy锛 AOP妗嗘灦鍒涘缓鐨勫璞 鐢ㄦ潵瀹炵幇鍒囬潰濂戠害锛坅spect contract锛夛紙鍖呮嫭閫氱煡鏂规硶鎵ц绛夊姛鑳斤級 鍦Spring涓 AOP浠g悊鍙互鏄疛DK鍔ㄦ佷唬鐞嗘垨鑰匔GLIB浠g悊 娉ㄦ剰 Spring 鏈鏂板紩鍏ョ殑鍩轰簬妯″紡锛坰chema based锛夐鏍煎拰@AspectJ娉ㄨВ椋庢牸鐨勫垏闈㈠0鏄 瀵逛簬浣跨敤杩欎簺椋庢牸鐨勭敤鎴锋潵璇 浠g悊鐨勫垱寤烘槸閫忔槑鐨 缁囧叆锛圵eaving锛...
绛旓細AOP涓篈spect Oriented Programming鐨勭缉鍐欙紝鏄潰鍚戝垏闈㈢紪绋嬶紝閫氳繃棰勭紪璇戞柟寮忓拰杩愯鏈熷姩鎬佷唬鐞嗗疄鐜扮▼搴忓姛鑳界殑缁熶竴缁存姢鐨勪竴绉嶆妧鏈AOP鏄疧OP鐨勫欢缁锛屾槸杞欢寮鍙戜腑鐨勪竴涓儹鐐癸紝涔熸槸Spring妗嗘灦涓殑涓涓噸瑕佸唴瀹癸紝鏄嚱鏁板紡缂栫▼鐨勪竴绉嶈鐢熻寖鍨嬨侫OP鐨勫嚭鐜板讥琛ヤ簡OOP鐨勮繖鐐逛笉瓒筹紝AOP 鏄竴涓蹇碉紝涓涓鑼冿紝鏈韩骞舵病...
绛旓細AOP鏄疧OP鐨勫欢缁锛屾槸杞欢寮鍙戜腑鐨勪竴涓儹鐐癸紝涔熸槸Spring妗嗘灦涓殑涓涓噸瑕佸唴瀹癸紝鏄嚱鏁板紡缂栫▼鐨勪竴绉嶈鐢熻寖鍨嬨傚埄鐢ˋOP鍙互瀵逛笟鍔¢昏緫鐨勫悇涓儴鍒嗚繘琛岄殧绂伙紝浠庤屼娇寰椾笟鍔¢昏緫鍚勯儴鍒嗕箣闂寸殑鑰﹀悎搴﹂檷浣庯紝鎻愰珮绋嬪簭鐨勫彲閲嶇敤鎬э紝鍚屾椂鎻愰珮浜嗗紑鍙戠殑鏁堢巼銆傦紙鐧惧害鐧剧锛夌畝鍗曠殑璇达細灏辨槸灏嗙▼搴忎腑閲嶅鐨勪唬鐮佹娊鍙栧嚭鏉ワ紝鍦ㄩ渶瑕...
绛旓細Spring 鐨搴旂敤绋嬪簭涓殑瀵硅薄鎻愪緵浜嗕簨鍔$鐞嗘湇鍔°傞氳繃浣跨敤 Spring AOP锛屼笉鐢ㄤ緷璧 EJB 缁勪欢锛屽氨鍙互灏嗗0鏄庢т簨鍔$鐞嗛泦鎴愬埌搴旂敤绋嬪簭涓係pring MVC 妗嗘灦锛歁VC 妗嗘灦鏄竴涓叏鍔熻兘鐨勬瀯寤 Web 搴旂敤绋嬪簭鐨 MVC 瀹炵幇銆傞氳繃绛栫暐鎺ュ彛锛孧VC 妗嗘灦鍙樻垚涓洪珮搴﹀彲閰嶇疆鐨勶紝MVC 瀹圭撼浜嗗ぇ閲忚鍥炬妧鏈紝鍏朵腑鍖呮嫭 JSP銆乂elocity...