Spring AOP
AOP編程
- 靜態代理
- 在真實主題之間,先後都可包一層,實現代理的額外拓展功能+真實主題的原來實現,目的是在不破壞原來真實主題的目標意圖和功能下,對真實主題進行了功能增強和擴展。
- 缺點:
- 儘管能實現:在不改變原來代碼的狀況下,新增長了須要的功能。
- 隨之帶來了新的問題:一個類對應一個接口,代理類也對應實現類一樣的接口,雖然咱們把散落在系統中各個方法都收集回籠到一塊,但一個接口就要出來一個代理類致使數量膨脹,不利於管理
- JDK動態代理
- 是基於接口實現的,也就是隻能對該類所實現接口中定義的方法進行代理,整個系統中一份。
- 經過反射類Proxy以及InvocationHandler回調接口實現的。
- CGLIB代理
- 是一個功能強大,高性能的代碼生成包,爲沒有實現接口的類提供代理。
- 原理:動態生成一個***被代理類的子類***,子類重寫被代理的類的全部***不是final的方法***。在子類中採用方法攔截的技術攔截全部父類方法的調用,順勢植入橫切邏輯。
- 新增jar包,cglib-nodep-2.1_3.jar
AOP相關概念
- 橫切性關注點
- 加在主業務先後的內容稱爲「橫切性關注點」。根據OOP編程原則,提供給多個地方調用的內容須要將它封裝爲一個方法,方法也不可能單獨存在,須要存在一個類中,由此引入了後續概念。
- 通知(advice)
- 將橫向業務內容也即橫切性關注點的內容封裝爲一個方法,這個方法稱爲「通知」,它能夠放在主方法的前面,也能夠放在後面。除此之外還有異常通知、環繞通知和最終通知。即***被方法化的橫切性關注點***稱爲通知。
- 鏈接點(joinpoint)
- 就是那些被攔截到的點,spring這些點就是***方法***。也就是主業務中的主要方法,每個方法就是一個鏈接點,好比User類的CRUD就是4個鏈接點。
- 切入點(pointcut)
- 就是要對那些方法進行攔截,是對須要攔截的joinpoint的定義。
- 切面(aspect)
- 一個個封裝了的方法稱爲advice,每個方法均應該封裝在一個類中,此外,在這些advice上也須要定義將這些通知用於那些方法前面後面,這些定義也封裝在這個類中,稱爲切入點,它們之後做用於joinpoint將這些統一封裝起來的類稱爲切面。公式表達:aspect=pointcut+advice
- 織入(weave)
- 將aspect運用到代理的目標對象上並致使proxy建立的過程稱爲織入。
歡迎關注本站公眾號,獲取更多信息