都說aop是oop(物件導向)的繼承與延續,我覺得理解aop還是得從oop出發,經歷從暴露問題到解決問題的過程。(2)oop程式設計存在的問題
二. 面向切面程式設計(aop)
(2)結合spring的簡單使用理解spring aop相關術語
(3)spring aop實現原理概述
在去年剛開始學習c語言的時候,自己清楚地感受到了面向過程程式設計的直觀性特徵:什麼事都需要自己親力親為,自然對於功能的實現邏輯完全熟悉。但是這樣的**可重用性低,無法做到**與功能復用;**之間的耦合度也較高,不同功能板塊之間會產生相互影響。
oop將不同的功能**塊實現封裝(類),每乙個功能板塊只專注於自己的事情(單一責任原則),不同功能塊之間不需要彼此知道對方的實現細節,只需要提供呼叫的方法介面便可以實現功能的復用。這樣的功能塊可重用性高,既有利於後期的拓展,也實現了封裝性,滿足開閉原則(拓展開放,修改關閉)。
另一方面,物件導向思想將不同**塊中的重複**向上抽取出來,單獨做為乙個超類。當需要用到這部分**的時候,就可以通過繼承這個超類來呼叫其中的方法。這種通過繼承抽取通用**的方式就叫做縱向抽取
。(縱向抽取之所以稱作縱向是因為關注點在各個分散的類當中)
隨著業務開發變得越來越複雜,通常在乙個業務模組中除了核心業務之外,還會包含有許多與核心業務毫不相關但又是不可或缺的外圍業務。例如當我們進行資料庫操作時,核心業務僅僅只是執行sql語句,但是在這之前可能還會有許可權驗證、日誌記錄、事務控制等諸多模組。
這些外圍業務與核心業務的混雜可能帶來的麻煩有:
傳統的oop思想已經無法通過繼承將這些外圍業務完全剝離開來了。
針對oop程式設計無法解決的問題,aop提供的解決思路是將這些外圍業務單獨提取出來,不直接寫入**當中,而是在需要他們的時候再自動應用到核心模組當中。由於效能檢測、許可權驗證、日誌記錄、事務控制等外圍業務往往不止在乙個模組**現,故把這些外圍業務的抽取就叫做橫向抽取
。
可形象化理解橫向抽取為:將多個業務板塊併排放在一起,每一列都是乙個單獨的業務模組,核心業務在中間,外圍業務在前排和後排,將前排和後排的外圍業務一排一排地剝離開來,這就是橫向抽取了。aop通常被視作oop的繼承與延續。oop是對乙個個分散的類進行屬性和行為的抽象封裝,關注點是分散的類;而aop針對的是程式中的某個模組或階段,在多個類的層面上進行切面上的抽取。總的說來,oop解決的是縱向上的問題,將**進行模組化封裝;aop解決的是橫向上的問題,將涉及到眾多模組的某一類問題抽取出來統一管理,二者並不對立。
定義目標介面與實現類
編寫切面類
package com.firework.utils;
import org.aspectj.lang.proceedingjoinpoint;
/** * @author 需要切入增強的切面類
*/public
class
logger
/** * 後置通知
*/public
void
afterprintlog()
/** * 異常通知
*/public
void
throwprintlog()
/** * 最終通知
*/public
void
endprintlog()
/** * 環繞通知
* 最為強大的通知
*/public object aroundprintlog
(proceedingjoinpoint pjp)
catch
(throwable throwable)
finally
}}
編寫配置檔案定義命名空間、將切面類與目標類交由spring ioc容器管理、配置切面類與通知、目標類
編寫測試類
結果如下:
在該案例**中,只對aoptest類中的main方法進行了增強,該方法就稱作切入點
。但是在該類中除了main方法還有sayhello方法,這些方法都稱作為連線點
。切入點也正是從這些連線點中過濾出來的。然後logger中的那些在需要切入點上執行的**就叫做通知
(增強),切入點和通知的組合就叫做切面
,表示將通知應用到哪些切入點上。將通知應用到切入點的過程就叫做織入
。
aop是通過靜態**或動態**的技術實現的。靜態**是指通過預編譯方式在編譯期就將外圍業務模組加入核心業務當中;動態**又分為jdk動態**和cglib動態**,在程式執行期動態加入外圍業務模組,前者通過反射來實現,後者通過繼承來實現。spring aop的實現原理就是基於動態織入的動態**技術。
物件導向設計思想
封裝 繼承 多型 既然是設計思想我想設計模式才是主要的 封裝 public,protect,private 繼承 單繼承 public,private 多重繼承,虛擬繼承 多型 靜態多型 函式過載,模板 動態多型 虛函式 封裝的目的 隱藏物件的屬性和實現細節,對外提供公開介面。降低和使用者 的耦合,...
物件導向思想的理解
物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。首先我們要區分一下 基於物件 和 物件導向 的區別。基於物件,通...
物件導向思想設計原則
物件導向思想設計原則 物件導向思想設計原則 在實際的開發中,我們要想更深入的了解物件導向思想,就必須熟悉前人總結過的物件導向的思想的設計原則。單一職責原則 開閉原則 黎克特制替換原則 依賴注入原則 介面分離原則 迪公尺特原則 單一職責原則 其實就是開發人員經常說的 高內聚,低耦合 也就是說,每個類應...