理解AOP思想(面向切面編程)

AOP:面向切面編程,相信不少剛接觸這個詞的同行都不是很明白什麼,百度一下看到下面這幾句話:html

在軟件業,AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。spring

其實在這裏談起AOP也是爲了總結一下本身這幾年工做以來對Spring的一些新認識。再次聲明一下,本文只記錄我的最spring的看法記錄,若有大神看到問題所在,請多指正一塊兒學習。編程

 

你們都知道Spring是一個框架,但框架這個詞對新手有點抽象,從功能的角度來定義它確實是一個框架,而從本質意義上來說,Spring是一個庫,一個Java庫,因此我我的以爲應該這樣回答Spring是什麼:Spring是一個庫,它的功能是提供了一個軟件框架,這個框架目的是使軟件之間的邏輯更加清晰,配置更靈活,實現這個目的的手段使用AOP和IOC,而AOP和IOC是一種思想,是一種什麼樣的思想等下細說,而AOP在Java裏是利用反射機制實現(你也能夠認爲是動態代理,不過動態代理的本質也是反射機制實現的,因此仍是先不要管動態代理,咱們這裏化繁爲簡,不讓它干擾我們對AOP的理解)

框架

這裏先說一下如何使用AOP:函數式編程

其實AOP也並非很複雜難懂,在我理解他只是簡化開發的一種方式,舉個例子:當咱們在開發一套後臺管理系統時必然有些操做在進行處理前先要驗證操做人是否已經登錄。若是登錄還可能要判斷這個用戶對應的角色是否有當前操做的權限。這時,在每一步操做前可能就須要咱們頻繁處理這種權限驗證問題。此時Spring就爲咱們制定了一種規範:AOP,若是把程序流程想象成管道,那麼在一個系統中就極可能存在多條這樣的管道。而在這多條管道中就有可能出現一樣功能的代碼段。AOP的實現其實就是把這些管道須要實現一樣功能的代碼段提取出來。就像一堆木頭被切成兩段那樣,而這個切入口就被成爲切面,每根木頭被切斷的地方就是切點。這樣一來要比一根根去處理木頭省事得多。函數

有了AOP,你寫代碼時不要把這個驗證用戶步驟寫進去,即徹底不考慮驗證用戶,你寫完以後,再另一個地方,寫好驗證用戶的代碼,而後告訴Spring你要把這段代碼加到哪幾個地方,Spring就會幫你加過去,而不要你本身Copy過去,若是你有多個控制流程,這個寫代碼的方法能夠大大減小你的時間,不過AOP的目的不只僅是這樣,而是讓咱們在寫代碼的時候可以更多的去考慮主流程,而不用去考慮那些不過重要的枝節流程。學習

 

懂C的都知道,良好的風格要求在函數起始處驗證參數,若是在C上能夠用AOP,就能夠先無論校驗參數的問題,過後使用AOP就能夠隔山打牛的給全部函數一次性加入校驗代碼,而你只須要寫一次校驗代碼。不知道C的不要緊,舉一個通用的例子,常常在debug的時候要打log吧,你也能夠寫好主要代碼以後,把打log的代碼寫到另外一個單獨的地方,而後命令AOP把你的代碼加過去,注意AOP不會把代碼加到源文件裏,可是它會正確的影響最終的機器代碼。.net

如今大概明白了AOP了嗎,咱們來理一下頭緒,上面那個方框像不像個平面,你能夠把它當塊板子,這塊板子插入一些控制流程,這塊板子就能夠當成是AOP中的一個切面。因此AOP的本質是在一系列縱向的控制流程中,把那些相同的子流程提取成一個橫向的面,這句話應該好理解吧,咱們把縱向流程畫成一條直線,然把相同的部分以綠色突出,以下圖左,而AOP至關於把相同的地方連一條橫線。debug

以下圖右,這個圖沒畫好,你們明白意思就行。代理

 

這個驗證用戶這個子流程就成了一個條線,也能夠理解成一個切面,aspect的意思我認爲是方面,你用什麼實物去類比,只要你能理解均可以。這裏的切面只插了兩三個流程,若是其它流程也須要這個子流程,也能夠插到其它地方去。

 

 

引用前者說明:百度百科;愛鼓搗;不負春光,努力生長

相關文章
相關標籤/搜索