天天看點

輕松了解AOP(面向切面程式設計)

本文旨在幫助還沒有了解AOP的童鞋看透弄懂AOP,也歡迎高手批評指正。

先說一個Spring是什麼吧,大家都是它是一個架構,但架構這個詞對新手有點抽象,以緻于越解釋越模糊,不過它确實是個架構的,但那是從功能的角度來定義的,從本質意義上來講,Spring是一個庫,一個Java庫,是以我個人覺得應該這樣回答Spring是什麼:Spring是一個庫,它的功能是提供了一個軟體架構,這個架構目的是使軟體之間的邏輯更加清晰,配置更靈活,實作這個目的的手段使用AOP和IoC,而AOP和IoC是一種思想,是一種什麼樣的思想呢,等下細說,先說AOP在Java裡是利用反射機制實作(你也可以認為是動态代理,不過動态代理也是反射機制實作的,是以還是先不要管動态代理,我們這裡化繁為簡,不讓它幹擾咱們對AOP的了解),如何使用AOP呢,很簡單滴,等下介紹。

下面先說AOP是什麼樣的思想,我們一步一步慢慢來,先看一下傳統程式的流程,比如銀行系統會有一個取款流程

輕松了解AOP(面向切面程式設計)

我們可以把方框裡的流程合為一個,另外系統還會有一個查詢餘額流程,我們先把這兩個流程放到一起:

輕松了解AOP(面向切面程式設計)

有沒有發現,這個兩者有一個相同的驗證流程,我們先把它們圈起來再說下一步:

有沒有想過可以把這個驗證使用者的代碼是提取出來,不放到主流程裡去呢,這就是AOP的作用了,有了AOP,你寫代碼時不要把這個驗證使用者步驟寫進去,即完全不考慮驗證使用者,你寫完之後,在另我一個地方,寫好驗證使用者的代碼,然後告訴Spring你要把這段代碼加到哪幾個地方,Spring就會幫你加過去,而不要你自己Copy過去,這裡還是兩個地方,如果你有多個控制流呢,這個寫代碼的方法可以大大減少你的時間,不過AOP的目的不是這樣,這隻是一個“副作用”,真正目的是,你寫代碼的時候,事先隻需考慮主流程,而不用考慮那些不重要的流程,懂C的都知道,良好的風格要求在函數起始處驗證參數,如果在C上可以用AOP,就可以先不管校驗參數的問題,事後使用AOP就可以隔山打牛的給所有函數一次性加入校驗代碼,而你隻需要寫一次校驗代碼。不知道C的沒關系,舉一個通用的例子,經常在debug的時候要打log吧,你也可以寫好主要代碼之後,把打log的代碼寫到另一個單獨的地方,然後指令AOP把你的代碼加過去,注意AOP不會把代碼加到源檔案裡,但是它會正确的影響最終的機器代碼。

現在大概明白了AOP了嗎,我們來理一下頭緒,上面那個方框像不像個平面,你可以把它當塊闆子,這塊闆子插入一些控制流程,這塊闆子就可以當成是AOP中的一個切面。是以AOP的本質是在一系列縱向的控制流程中,把那些相同的子流程提取成一個橫向的面,這句話應該好了解吧,我們把縱向流程畫成一條直線,然把相同的部分以綠色突出,如下圖左,而AOP相當于把相同的地方連一條橫線,如下圖右,這個圖沒畫好,大家明白意思就行。

輕松了解AOP(面向切面程式設計)
輕松了解AOP(面向切面程式設計)