Spring AOP學習筆記

AOP設計基本原理

什么是AOP(即面向切面編程)?

通常面向對象的程序,代碼都是按照時間序列縱向展開的,而他們都有一個共性:即都是以方法調用作為基本執(zhí)行單位展開的。將方法調用當做一個連接點,那么由連接點串起來的程序執(zhí)行流就是整個程序的執(zhí)行過程。

AOP則是從另外一個角度來考慮整個程序的,AOP將每一個方法調用,即連接點作為編程的入口,針對方法調用進行編程。從執(zhí)行的邏輯上來看,相當于在之前縱向的按照時間軸執(zhí)行的程序橫向切入。相當于將之前的程序橫向切割成若干的面,即Aspect每個面被稱為切面。

所以,根據(jù)我的理解,AOP本質上是針對方法調用的編程思路。

既然AOP是針對切面進行的編程的,那么,你需要選擇哪些切面(即 連接點Joint Point)作為你的編程對象呢?

因為切面本質上是每一個方法調用,選擇切面的過程實際上就是選擇方法的過程。那么,被選擇的切面(Aspect)在AOP術語里被稱為切入點(Point Cut).? 切入點實際上也是從所有的連接點(Join point)挑選自己感興趣的連接點的過程。

代理模式的引入:

加入了代理模式的Java程序執(zhí)行流,使得所有的方法調用都經(jīng)過了代理對象。對于Spring AOP框架而言,它負責控制著真?zhèn)€容器內(nèi)部的代理對象。當我們調用了某一個實例對象的任何一個非final的public方法時,整個Spring框架都會知曉。

此時的SpringAOP框架在某種程度上扮演著一個上帝的角色:它知道你在這個框架內(nèi)所做的任何操作,你對每一個實例對象的非final的public方法調用都可以被框架察覺到!

既然Spring代理層可以察覺到你所做的每一次對實例對象的方法調用,那么,Spring就有機會在這個代理的過程中插入Spring的自己的業(yè)務代碼。

Spring AOP的工作原理

為了降低我們對Spring的AOP的理解難度,我在這里將代理角色的職能進行了簡化,方便大家理解。(注意:真實的Spring AOP的proxy角色扮演的只能比這復雜的多,這里只是簡化,方便大家理解,請不要先入為主)代理模式的代理角色最起碼要考慮三個階段:

1.在調用真正對象的方法之前,應該需要做什么?

2.在調用真正對象的方法過程中,如果拋出了異常,需要做什么?

3.在調用真正對象的方法后,返回了結果了,需要做什么?

AOP對這個方法調用的編程,就是針對這三個階段插入自己的業(yè)務代碼。

現(xiàn)在我們假設當前RealSubject這個角色的類是org.luanlouis.springlearning.aop.FooService,當前這個連接點對應的方法簽名是:public void foo()。那么上述的代理對象的三個階段將會有以下的處理邏輯:

1.在調用真正對象的方法之前

proxy會告訴Spring AOP:? "我將要調用類org.luanlouis.springlearning.aop.FooServicepublic void foo(),在調用之前,你有什么處理建議嗎?";

Spring AOP這時根據(jù)proxy提供的類名和方法簽名,然后拿這些信息嘗試匹配是否在其感興趣的切入點內(nèi),如果在感興趣的切入點內(nèi),Spring AOP會返回MethodBeforeAdvice處理建議,告訴proxy應該執(zhí)行的操作;

2.在調用真正對象的方法過程中,如果拋出了異常,需要做什么?

proxy告訴Spring AOP: “我調用類org.luanlouis.springlearning.aop.FooServicepublic void foo()過程中拋出了異常,你有什么處理建議?”

Spring AOP根據(jù)proxy提供的類型和方法簽名,確定了在其感興趣的切入點內(nèi),則返回相應的處理建議ThrowsAdvice,告訴proxy這個時期應該采取的操作。

3.在調用真正對象的方法后,返回了結果了,需要做什么?

proxy告訴Spring AOP:"我調用類org.luanlouis.springlearning.aop.FooServicepublic void foo()結束了,并返回了結果你現(xiàn)在有什么處理建議?";

Spring AOP根據(jù)proxy提供的類型名和方法簽名,確定了在其感興趣的切入點內(nèi),則返回AfterReturingAdivce處理建議,proxy得到這個處理建議,然后執(zhí)行建議;


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容