都知道面向对象了,那么面向切面呢!通俗易懂带你走进面向切面编程!
什么是AOP
1、概念
在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
說一下OOP
有一天面試官問你什么是OOP?
然后你可能會一臉懵逼的說OOP?what?這是什么玩意!其實它就是你一直學的面向對象編程(Object Oriented Programming),
那么我們要怎么理解面向對象編程呢?
我們都知道面向對象編程之前還有一個面向過程編程。我們學習編程的基礎C語言就是面向過程的編程。要怎么具體理解這兩者的區別呢?
舉個簡單的例子。當你要吃一份蛋炒飯的時候,你該怎么辦,下面給你兩個選擇!
1、 自己買食材,然后煮飯,炒蛋,加上一切你想下的配料然后最后炒完出鍋。
2、你去某某某大酒店,坐下大喊:“服務員!來一份蛋炒飯”(應該不會被打死吧,就點一份蛋炒飯)
看出來區別了嘛!其實說到這里應該都有感覺了,1就是面向過程的,2就是面向對象的!
那么這兩種編程方式到底有什么區別呢?
第二種的話,你不需要知道蛋炒飯具體是怎么做的,你只需要點餐然后最后就能吃到。如果你點完突然不想吃了(在服務員沒炒之前哈,不然老板可能以為你搞事情,會把你轟出去!),想換成牛肉炒飯,此時你只需要跟老板說一聲就能換了。然后如果你本身是第一種的話,你剛買的食材就廢了。因為你只有雞蛋,沒有牛肉,可能一切就得重新來過!這就兩者最明顯的區別
面向過程是一步一步分析,一步一步實現的,
面向對象是模型化的,我們只需要抽象出一個類就行,封裝起來,然后要用的時候直接調用。至于具體里面怎么實現的(就是蛋炒飯怎么抄的完全不關我們的事情,我們只需要吃就行了!)
所以現在來總結一下兩者的優缺點:
面向對象:
- 優點:易維護、易復用、易擴展
- 缺點:性能比較差,因為類調用時需要實例化,開銷比較大,比較消耗資源
面向過程:
- 優點:性能好
- 缺點:不易維護、不易復用、不易擴展
然后下面回到我們今天的主題,AOP面向切面編程!是在我們的 OOP的基礎上提出來的!
2、切面要怎么理解?
AOP是面向切面編程,那么這個切面到底是指什么呢?
其實很容易理解,一個完整的西瓜,我們拿一把刀沿著中間切下去,此時我們就得到了兩個切面。
在編程中,對象與對象之間,方法與方法之間,模塊與模塊之間都是一個個切面
3、那么面向切面有什么用呢?
先來說一下我們很熟悉的一個例子:
例如:現在有一個 Dog類 和 Cat類,它們都有共同的方法,它們都能跑 run(),都能吃 eat()。
在我們 OOP中,此時就會寫一個 Animal類,這個類有了 Dog類和 Cat類中共同的方法。run() 和 eat()
這樣的話我們就只需要在實現 Dog和Cat 的時候,去繼承 Animal類即可!這樣確實減少了我們重復代碼的書寫。
但是現在問題來了!
如果此時在我們的父類中多個方法的相同位置中,出現了很多重復的代碼!此時應該怎么辦?還有的是,Java只提供單繼承,不能繼承其它父類。
OOP 是一個縱向的的體系,從上到下的。
所以此時我們的主角來了!AOP 面向切面的。
把這一處處需要用到這些共同方法地方都看成一個切面,然后把共同方法獨立出來。再橫切進去。
可能有人會想說,我們父類中,不就是把子類中共同的方法提出來了嘛?那么這不是一樣的嗎?
但是我們還需要想到的一點就是,父類中也會有自己的一些動作(自己的業務代碼),此時和這些子類的共同方法混雜在了一起,這個時候就會顯色十分的臃腫!變得不易維護!
AOP就是用來解決這些問題的!
AOP 將我們這些所謂的需要橫切的代碼單獨提取出來,和原來的業務代碼進行了分離。
上面這張圖就能夠很明顯的看出來,這兩者的不同。在這個過程中,需要保證的是,原來的業務代碼不能被破壞掉!
4、AOP 解決了什么問題呢?
通過上面的分析可以發現,AOP 主要用來解決:在不改變原有業務邏輯的情況下,增強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重復。
5、AOP 中的相關概念
學習了Spring的同學可能就知道,在Spring中,有兩個很重要的東西,一個是 IOC , 另外一個就是AOP了,IOC在我的上一篇文章就已經帶著大家理解了一遍了,沒看的同學們可以查看歷史消息。在Spring中,AOP有很多專業的概念,以下為大家列了出來:
- Aspect(切面): Aspect 聲明類似于 Java 中的類聲明,在 Aspect 中會包含著一些 Pointcut 以及相應的 Advice。
- Joint point(連接點):表示在程序中明確定義的點,典型的包括方法調用,對類成員的訪問以及異常處理程序塊的執行等等,它自身還可以嵌套其它 joint point。
- Pointcut(切點):表示一組 joint point,這些 joint point 或是通過邏輯關系組合起來,或是通過通配、正則表達式等方式集中起來,它定義了相應的 Advice 將要發生的地方。
- Advice(增強):Advice 定義了在 Pointcut 里面定義的程序點具體要做的操作,它通過 before、after 和 around 來區別是在每個 joint point 之前、之后還是代替執行的代碼。
- Target(目標對象):織入 Advice 的目標對象.。
- Weaving(織入):將 Aspect 和其他對象連接起來, 并創建 Advice的 object 的過程
然后最后舉一個例子,例子是在CSDN上面看到的,非常的形象!文字有點多,但是還是希望大家把它看完,看完后真的受益匪淺
讓我們來假設一下, 從前有一個叫爪哇的小縣城, 在一個月黑風高的晚上, 這個縣城中發生了命案. 作案的兇手十分狡猾, 現場沒有留下什么有價值的線索. 不過萬幸的是, 剛從隔壁回來的老王恰好在這時候無意中發現了兇手行兇的過程, 但是由于天色已晚, 加上兇手蒙著面, 老王并沒有看清兇手的面目, 只知道兇手是個男性, 身高約七尺五寸. 爪哇縣的縣令根據老王的描述, 對守門的士兵下命令說: 凡是發現有身高七尺五寸的男性, 都要抓過來審問. 士兵當然不敢違背縣令的命令, 只好把進出城的所有符合條件的人都抓了起來.
小故事和 AOP 到底有什么對應關系?
首先我們知道, 在 Spring AOP 中 Joint point 指代的是所有方法的執行點, 而 point cut 是一個描述信息, 它修飾的是 Joint point, 通過 point cut, 我們就可以確定哪些 Joint point 可以被織入 Advice. 對應到我們在上面舉的例子, 我們可以做一個簡單的類比, Joint point 就相當于 爪哇的小縣城里的百姓,pointcut 就相當于 老王所做的指控, 即兇手是個男性, 身高約七尺五寸, 而 Advice 則是施加在符合老王所描述的嫌疑人的動作: 抓過來審問.
為什么可以這樣類比呢?
- Joint point : 爪哇的小縣城里的百姓: 因為根據定義, Joint point 是所有可能被織入 Advice 的候選的點, 在 Spring AOP中, 則可以認為所有方法執行點都是 Joint point. 而在我們上面的例子中, 命案發生在小縣城中, 按理說在此縣城中的所有人都有可能是嫌疑人.
- Pointcut :男性, 身高約七尺五寸: 我們知道, 所有的方法(joint point) 都可以織入 Advice, 但是我們并不希望在所有方法上都織入 Advice, 而 Pointcut 的作用就是提供一組規則來匹配joinpoint, 給滿足規則的 joinpoint 添加 Advice. 同理, 對于縣令來說, 他再昏庸, 也知道不能把縣城中的所有百姓都抓起來審問, 而是根據兇手是個男性, 身高約七尺五寸, 把符合條件的人抓起來. 在這里 兇手是個男性, 身高約七尺五寸 就是一個修飾謂語, 它限定了兇手的范圍, 滿足此修飾規則的百姓都是嫌疑人, 都需要抓起來審問.
- Advice :抓過來審問, Advice 是一個動作, 即一段 Java 代碼, 這段 Java 代碼是作用于 point cut 所限定的那些 Joint point 上的. 同理, 對比到我們的例子中, 抓過來審問 這個動作就是對作用于那些滿足 男性, 身高約七尺五寸 的爪哇的小縣城里的百姓.
- Aspect::Aspect 是 point cut 與 Advice 的組合, 因此在這里我們就可以類比: “根據老王的線索, 凡是發現有身高七尺五寸的男性, 都要抓過來審問” 這一整個動作可以被認為是一個 Aspect.
所以這個小故事其實很好的向我們展示了彼此之間的關系!
能夠看到這里的同學,我覺得毅力是相當的好的!因為這篇文章基本全身理論性的東西,阿藍在書寫和規劃的過程也是有想到寫出來會十分的枯燥!但是沒辦法,我們看完了能夠掌握到它的精髓,這就很足夠了!
最后補充一下AOP的應用場景
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
END
最后希望這篇文章能夠幫助到你,如果文章中存在什么錯誤,請大家加以指正!
總結
以上是生活随笔為你收集整理的都知道面向对象了,那么面向切面呢!通俗易懂带你走进面向切面编程!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 内存溢出快速定位
- 下一篇: Netty入门——基于NIO实现机器客服