本文轉自 KenWang (原文地址)html
本文旨在幫助尚未理解AOP的童鞋看透弄懂AOP,也歡迎高手批評指正。框架
先說一個Spring是什麼吧,你們都是它是一個框架,但框架這個詞對新手有點抽象,以至於越解釋越模糊,不過它確實是個框架的,但那是從功能的角度來定義的,從本質意義上來說,Spring是一個庫,一個Java庫,因此我我的以爲應該這樣回答Spring是什麼:Spring是一個庫,它的功能是提供了一個軟件框架,這個框架目的是使軟件之間的邏輯更加清晰,配置更靈活,實現這個目的的手段使用AOP和IoC,而AOP和IoC是一種思想,是一種什麼樣的思想呢,等下細說,先說AOP在Java裏是利用反射機制實現(你也能夠認爲是動態代理,不過動態代理也是反射機制實現的,因此仍是先不要管動態代理,咱們這裏化繁爲簡,不讓它干擾我們對AOP的理解),如何使用AOP呢,很簡單滴,等下介紹。函數
下面先說AOP是什麼樣的思想,咱們一步一步慢慢來,先看一下傳統程序的流程,好比銀行系統會有一個取款流程spa
咱們能夠把方框裏的流程合爲一個,另外系統還會有一個查詢餘額流程,咱們先把這兩個流程放到一塊兒:debug
有沒有發現,這個二者有一個相同的驗證流程,咱們先把它們圈起來再說下一步:代理
有沒有想過能夠把這個驗證用戶的代碼是提取出來,不放到主流程裏去呢,這就是AOP的做用了,有了AOP,你寫代碼時不要把這個驗證用戶步驟寫進去,即徹底不考慮驗證用戶,你寫完以後,在另我一個地方,寫好驗證用戶的代碼,而後告訴Spring你要把這段代碼加到哪幾個地方,Spring就會幫你加過去,而不要你本身Copy過去,這裏仍是兩個地方,若是你有多個控制流呢,這個寫代碼的方法能夠大大減小你的時間,不過AOP的目的不是這樣,這只是一個「反作用」,真正目的是,你寫代碼的時候,事先只需考慮主流程,而不用考慮那些不重要的流程,懂C的都知道,良好的風格要求在函數起始處驗證參數,若是在C上能夠用AOP,就能夠先無論校驗參數的問題,過後使用AOP就能夠隔山打牛的給全部函數一次性加入校驗代碼,而你只須要寫一次校驗代碼。不知道C的不要緊,舉一個通用的例子,常常在debug的時候要打log吧,你也能夠寫好主要代碼以後,把打log的代碼寫到另外一個單獨的地方,而後命令AOP把你的代碼加過去,注意AOP不會把代碼加到源文件裏,可是它會正確的影響最終的機器代碼。htm
如今大概明白了AOP了嗎,咱們來理一下頭緒,上面那個方框像不像個平面,你能夠把它當塊板子,這塊板子插入一些控制流程,這塊板子就能夠當成是AOP中的一個切面。因此AOP的本質是在一系列縱向的控制流程中,把那些相同的子流程提取成一個橫向的面,這句話應該好理解吧,咱們把縱向流程畫成一條直線,然把相同的部分以綠色突出,以下圖左,而AOP至關於把相同的地方連一條橫線,以下圖右,這個圖沒畫好,你們明白意思就行。blog
這個驗證用戶這個子流程就成了一個條線,也能夠理解成一個切面,aspect的意思我認爲是方面,你用什麼實物去類比,只要你能理解均可以。這裏的切面只插了兩三個流程,若是其它流程也須要這個子流程,也能夠插到其它地方去。圖片