javascript
深入理解Spring AOP思想
什么是AOP?AOP解決了什么問題?
在傳統的開發模式中,以下層次的是非常常見的一種,業務層每一個方法都要有重復的事務代碼
如何改善這個問題?
AOP希望將A、B 這些分散在各個業務邏輯中的相同代碼,通過橫向切割的方式抽取到一個獨立的模塊中
?
將這些重復性的橫切邏輯獨立出來很容易,但是如何將獨立的橫切邏輯 融合到 業務邏輯中 來完成和原來一樣的業務操作,這是事情的關鍵,也是AOP要解決的主要問題。
Spring對事務管理這一點用了很好的處理方式:即將這些代碼段抽取出來,然后,在需要事務控制的地方(**類.**方法)添加一個配置,那么,這個方法就會應用事務控制,無需在代碼中編寫事務代碼
?
?AOP的實現機制(動態代理)
1.什么是代理
滿足代理的3個基本要求是
1.代理人(中介)
2.需要找代理的主體(用戶)
3.需要代理的事情一定要做,但是主體做的不專業或者沒時間做
?
2.什么是動態代理,和靜態代理有什么區別
靜態代理就是不變的,只針對一種人服務,例如你媽媽幫你找老婆,你是代理的主體,而你媽媽就是代理人,你媽媽只是服務于你,因為你媽媽并不關心其他人有沒有老婆,這種你媽幫你找老婆的模式就叫做靜態代理,用代碼來表示就是 A.class ---->? Proxy.class
?
而動態代理就是可變的,針對有需求的人服務,例如婚介所幫你找老婆,你是代理的主體,而婚介所就是代理人,婚介所服務于廣大單身人民群眾,這種婚介所幫你找老婆的模式就叫動態代理,用代碼表示? A.class? 、B.class、 等等在運行時確定的結果類,都可以傳進去? 可以------>? ?Proxy.class?
?
Spring AOP使用動態代理技術在運行期織入增強的代碼,使用了兩種代理機制,一種是基于JDK的動態代理,另一種是基于CGLib的動態代理。
1.JDK動態代理
被代理類實現InvokcationHandler接口 ,原來的類只是一個模板,通過一個配置文件動態讀取方法的內容(配合反射) ,通過字節碼重組成成為一個新的類,調用時就是調用新的類
2.CGLIB動態代理(Spring AOP采用)
不需要任何繼承和實現就可以實現動態代理機制,底層原理,通過生成一個動態的類,把動態的類作為子類,繼承我們自己的模板類,然后形成新的類,因為子類擁有父類的引用,所以達到動態代理的效果,這樣相當于對于開發人員降低要求。
?
- aop實現原理其實是java動態代理,但是jdk的動態代理只支持接口代理,所以spring的aop是用cglib這個庫實現的,cglib使用了asm這個直接操縱字節碼的框架,所以可以做到不實現接口的情況下完成動態代理。
- 面向切面編程,把散落在程序中的公共部分提取出來,做成切面類,這樣的好處在于,代碼的可重用,一旦涉及到該功能的需求發生變化,只要修改該代碼就行,否則,你要到處修改,如果只要修改1、2處那還可以接受,萬一有1000處呢。 AOP底層的東西就是JDK動態代理和CGLIB代理,說白了就是增強類的功能。 最常用的AOP應用在數據庫連接以及事務處理上
?
轉載于:https://www.cnblogs.com/zhuoqingsen/p/8595625.html
總結
以上是生活随笔為你收集整理的深入理解Spring AOP思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: get中添加header
- 下一篇: 驼峰法