1. 程式人生 > >AOP設計與原理(連線點,切入點與代理模式)——Spring AOP(二)

AOP設計與原理(連線點,切入點與代理模式)——Spring AOP(二)

AOP設計與原理(連線點,切入點與代理模式)

上一章講了AOP的概念:
這一章換個角度講一下什麼是AOP,(本章屬於半轉載)。


java程式執行——方法呼叫

在學java基礎我們就知道,一個java程式總是從main方法開始執行的,當開始執行時JVM會建立一個主執行緒,主執行緒就以main方法為入口開始執行程式碼。從執行緒棧的角度來看,JVM處理Java程式的基本單位是方法呼叫(巨集觀角度)。
在我們使用面向物件解決問題時,我們考慮的是如何按照執行順序通過方法呼叫來實現我們的業務邏輯。
如果從虛擬機器執行緒棧的角度考慮Java程式執行的話,那麼,你會發現,整個程式執行的過程就是方法呼叫的過程。


連線點

我們將上述的執行緒棧裡的方法呼叫按照執行流排列,會有如下類似的圖:
在這裡插入圖片描述
基於程式執行的先後順序,我們可以將方法的呼叫排成一條線。而每個方法呼叫則可以看成這條線上的一個節點。這個節點在AOP的術語中,被稱為Join Point,即連線點。 一個Java程式的執行的過程,就是若干個連線點連線起來依次執行的過程。


切面/切入點

AOP(Aspect Oriented Programming)則是從另外一個角度來考慮整個程式的,AOP將每一個方法呼叫,即連線點作為程式設計的入口,針對方法呼叫進行程式設計。從執行的邏輯上來看,相當於在之前縱向的按照時間軸執行的程式橫向切入。相當於將之前的程式橫向切割成若干的面,即Aspect.每個面被稱為切面。

在這裡插入圖片描述

因為切面本質上是每一個方法呼叫,選擇切面的過程實際上就是選擇方法的過程。那麼,被選擇的切面(Aspect)在AOP術語裡被稱為切入點(Point Cut). 切入點實際上也是從所有的連線點(Join point)挑選自己感興趣的連線點的過程。
在這裡插入圖片描述


代理模式實現AOP

既然AOP是對方法呼叫進行的程式設計,那麼問題來了,AOP如何捕獲方法呼叫的呢?也就是說,AOP怎麼知道當前執行到了哪個方法了呢?
為了弄清這個問題,你就不得不瞭解設計模式中的代理模式了!
什麼是代理模式?
舉例:真正的例項物件就先對迪麗熱巴,迪麗熱巴沒火的時候人家讓她去跳舞,她自己就去了,就相當於之前沒有代理物件的時候,現在有了代理物件就相當於她有了經紀人,想讓迪麗熱巴跳舞就得先聯絡經紀人。
我們假設在我們的Java程式碼裡,都為例項物件通過代理模式建立了代理物件,訪問這些例項物件必須要通過代理,那麼,加入了proxy物件(代理角色)的Java程式執行流會變得稍微複雜起來。
在這裡插入圖片描述


既然Spring代理層可以察覺到你所做的每一次對例項物件的方法呼叫,那麼,Spring就有機會在這個代理的過程中插入Spring的自己的業務程式碼。


下一章:動態代理實現AOP的兩種方式: