springAOP——可以提升開發效率的神器
好的各位小夥伴
雖然今天是周六
我們還是不能鬆懈
好的開始今天的分享
來一起看一下吧
!
AOP 是什麼
AOP 是 Aspect-oriented programming 面向切面(方面)的編程的簡寫,可以把業務邏輯和系統級的服務進行隔離,使業務邏輯跟各個系統級服務的耦合度降低,提高程序的重用性和開發效率
業務邏輯就是某個類的某個方法本身要實現的功能。比如我們之前寫的 studentservice 裡面實現的增刪改查就是業務邏輯!
系統級的服務像系統的日誌,事務,許可權驗證等
系統日誌會記錄什麼人在哪一天什麼時間做了哪些操作。
許可權驗證就是驗證我們的許可權,還記得我們之前的聊天室的踢人功能嗎?只有 admin才可以踢人
事務這個概念,今天暫時先放一下,在之後做例子的時候會演示給大家的!
那麼現在把這些系統級服務的插入進我們的功能代碼中,用一行輸出語句代表我們的業務邏輯,在執行一個操作之前,要先進行許可權驗證,驗證通過之後,再來執行我們的操作,操作完成後,記錄日誌。
小夥伴們自己想一下為什麼是這個順序?
這是在沒有 AOP 之前,我們每個功能都要這麼去添加系統級服務,要是這個項目有一千個類,你就去加吧,至少一周不用干別的了,就是複製代碼!
現在我們有了 AOP 就可以不用這麼麻煩了
AOP 的底層原理
AOP 的底層實現的原理:動態代理
首先是實例化我們要代理的目標類 target, 然後在生成一個動態代理 proxy ,這個方法裡面有三個參數,我們的目標類,目標類的介面,實現 invocation 介面。實現介面的同時需要實現裡面的方法!這個方法里,有我們的代理對象,方法和參數!
我已經把驗證和日誌都注釋掉了
只要我們的測試結果中有我們標註的這兩行,證明我們成功的插入了系統級服務!
測試結果:
看著很麻煩是不是,當然我們在實際的開發中不會去手動的生成代理,這裡只是給大家演示 AOP 的底層原理,要是這麼麻煩我們還不如直接在代碼裡面插入服務了。
注意動態代理有兩種方式:jdk動態代理 /cglib動態代理
jdk 的動態代理機制只能代理實現了介面的類
cglib 的動態代理既可以代理實現了介面的類,也可以代理沒有實現介面的類
AOP一些專業術語
切面(Aspect): 就是交叉在各個業務邏輯中的系統服務,類似於安全驗證,事務處理,日誌記錄都可以理解為切面。
織入(weaving) :就是將切面代碼插入到目標對象某個方法的過程,相當於我們在jdk動態代理裡面的 invocationHandler介面方法的內容 。
連接點(JointPoint) :理論上可能被切面織入的所有方法 ,比如 addStudent...通常所有方法都可以被稱為連接點。
切入點(PointCut) :就是實際上被切面織入的方法。
目標對象(target) :就是切入點和連接點所屬的類 StudentService。
通知(Advice): 就是切面的實現,切面織入的目標對象,時間點(方法執行前 ,後,前後,異常)以及內容。
顧問(Advisor) :其實就是通知的一個封裝和延伸,可以將通知以更為複雜的方式織入到某些方法中。
好的各位小夥伴
今天就先到這裡了
我會繼續努力的
再見了各位


TAG:java吧 |