日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

《Spring设计思想》AOP设计思想与原理(图文并茂)

發布時間:2025/3/21 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Spring设计思想》AOP设计思想与原理(图文并茂) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文將通過一個另外一個角度來詮釋AOP的概念,幫助你更好地理解和使用Spring AOP。

讀完本文,你將了解到:

1. Java程序運行在JVM中的特征

2. Java程序的執行流【了解AOP、連接點(Join Point)、切入點(point cut) 的概念 】

3. 引入了代理模式的Java程序執行流(AOP實現的機制)

4. Spring AOP的工作原理

1. Java程序運行在JVM中的特征

當我們在某個類Foo中寫好了一個main()方法,然后執行java Foo,你的Java程序之旅就開啟了,如下:

那么在這個執行的過程中,JVM都為你干了什么呢?

當你執行java Foo 的時候,JVM會創建一個主線程main,這個主線程以上述的main()方法作為入口,開始執行你的代碼。每一個線程在內存中都會維護一個屬于自己的棧(Stack),記錄著整個程序執行的過程。棧里的每一個元素稱為棧幀(Stack Frame),棧幀表示著某個方法調用,會記錄方法調用的信息;實際上我們在代碼中調用一個方法的時候,在內存中就對應著一個棧幀的入棧和出棧。

在某個特定的時間點,一個Main線程內的棧會呈現如下圖所示的情況:

從線程棧的角度來看,我們可以看到,JVM處理Java程序的基本單位是方法調用。實際上,JVM執行的最基本單位的指令(即原子操作)是匯編語言性質的機器字節碼。這里之所以講方法調用時Java程序的基本執行單位,是從更宏觀的角度看待的。

如何獲取到虛擬機線程棧中的內容(即方法調用過程)?

試想一下,如何能夠獲取到JVM線程棧中的方法調用的內容? 我相信所有的Java programmer都知道這個答案。Java Programmer幾乎每天都能看到它------當我們的代碼拋出異常而未捕獲或者運行時出現了Error錯誤時,我們會受到一個非常討厭的Log信息,如下:

當然,除了代碼拋出異常外,我們還是可以其他方式察覺JVM線程棧內的內容。可以通過Thread.dumpStack()方法創建一個假的Exception實例,然后將這個Exception實例記錄的當前線程棧的內容輸出到標準錯誤流中。例如我在某處代碼里執行了Thread.dumpStack()方法,輸出了如下的結果:

2. Java程序執行流 【了解AOP、連接點(Join Point)、切入點(point cut) 的概念 】

如果從虛擬機線程棧的角度考慮Java程序執行的話,那么,你會發現,真個程序運行的過程就是方法調用的過程。我們按照方法執行的順序,將方法調用排成一串,這樣就構成了Java程序流。

我們將上述的線程棧里的方法調用按照執行流排列,會有如下類似的圖:

基于時間序列,我們可以將方法調用排成一條線。而每個方法調用則可以看成Java執行流中的一個節點。這個節點在AOP的術語中,被稱為Join Point,即連接點。 一個Java程序的運行的過程,就是若干個連接點連接起來依次執行的過程。

在我們正常的面向對象的思維中, 我們考慮的是如何按照時間序列通過方法調用來實現我們的業務邏輯。那么,什么是AOP(即面向切面的編程)呢?

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

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

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

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

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

Spring AOP框架中通過 方法匹配表達式來表示切入點(Point Cut),至于詳細的表達式語法是什么 不是本文的重點,請讀者自行參考Spring相應的說明文檔。

既然AOP是針對方法調用(連接點)的編程, 現在又選取了你感興趣的自己感興趣的鏈接點---切入點(Point Cut)了,那么,AOP能對它做什么類型的編程呢?AOP能做什么呢?

了解這個之前,我們先要知道一個非常重要的問題: 既然AOP是對方法調用進行的編程,那么,AOP如何捕獲方法調用的呢? 弄清楚這個問題,你不得不了解設計模式中的代理模式了。下面我們先來了解一下引入了代理模式的Java程序執行流是什么樣子的。

3. 引入了代理模式的Java程序執行流(AOP實現的機制)

我們假設在我們的Java代碼里,都為實例對象通過代理模式創建了代理對象,訪問這些實例對象必須要通過代理,那么,加入了proxy對象的Java程序執行流會變得稍微復雜起來。

我們來看下加入了proxy對象后,Java程序執行流的示意圖:

由上圖可以看出,只要想調用某一個實例對象的方法時,都會經過這個實例對象相對應的代理對象, 即執行的控制權先交給代理對象。

關于代理模式

代理模式屬于Java代碼中經常用到的、也是比較重要的設計模式。代理模式可以為某些對象除了實現本身的功能外,提供一些額外的功能,大致作用如下圖所示:

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

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

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

4. Spring AOP的工作原理

前面已經介紹了AOP編程首先要選擇它感興趣的連接點----即切入點(Point cut),那么,AOP能對切入點做什么樣的編程呢? 我們先將代理模式下的某個連接點細化,你會看到如下這個示意圖所表示的過程:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    上述的示意圖中已經明確表明了Spring AOP應該做什么樣的工作:根據proxy提供的特定類的特定方法執行的特定時期階段給出相應的處理建議。要完成該工作,Spring AOP應該實現:

    1.確定自己對什么類的什么方法感興趣? -----即確定 AOP的切入點(Point Cut),這個可以通過切入點(Point Cut)表達式來完成;

    2. 對應的的類的方法的執行特定時期給出什么處理建議?------這個需要Spring AOP提供相應的建議 ,即我們常說的Advice。

    到此為止,AOP的基本工作機制已經介紹完畢了。歡迎各位童鞋關注交流

    總結

    以上是生活随笔為你收集整理的《Spring设计思想》AOP设计思想与原理(图文并茂)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久久久免费 | 白石茉莉奈番号 | 97国产精品视频人人做人人爱 | 99热精品在线 | 日本精品久久久久中文字幕 | 又黄又爽视频在线观看 | 午夜精品久久久久久久蜜桃 | 加勒比一区二区 | 欧美激情五月 | 欧美成人做爰大片免费看黄石 | 大屁股白浆一区二区三区 | 色一涩 | 久久精品欧美日韩 | 一区二区三区www | 欧美精品乱人伦久久久久久 | 色漫在线观看 | www.男人的天堂.com | 五色天婷婷 | 中文字幕精品视频在线观看 | 狠狠操狠狠操狠狠操 | 免费看黄色的视频 | 999伊人 | 美女隐私免费网站 | 超污视频网站 | 91久久精品一区二区 | 亚洲一区二区三区四区五区xx | 日本久久久久久久久久 | 精品国产一区在线观看 | 久久免费影院 | 99久久人妻精品免费二区 | 中文不卡av | 欧美成人生活片 | 欧美精产国品一二三区 | 免费黄色a级片 | 黑人巨大精品欧美一区二区 | 国产三级国产精品国产国在线观看 | 久草91 | 亚洲免费色图 | 亚洲天堂五码 | 夜夜高潮夜夜爽国产伦精品 | 国家队动漫免费观看在线观看晨光 | 日本私人影院 | 高潮无码精品色欲av午夜福利 | 牛夜精品久久久久久久99黑人 | 国产精品va在线观看无码 | 欧美日韩在线国产 | 国产.com | 久久久精品免费观看 | 国产欧美在线视频 | 国产日本在线播放 | 日本h片在线观看 | 国产精品高潮呻吟视频 | 亚洲永久精品国产 | 欧美成人自拍 | 国产精品亚洲一区二区三区 | 一区二区三区 日韩 | 色偷偷免费费视频在线 | 欧美性69 | 深夜影院在线观看 | 最新精品国产 | 国产一伦一伦一伦 | 成人欧美一区二区三区黑人免费 | 色屁屁在线| 国产午夜啪啪 | 亚洲天堂伊人 | 国产 日韩 欧美 成人 | 国产在线视视频有精品 | 欧美成人三级精品 | 亚洲av综合色区无码一区爱av | 亚洲人成高清 | 国产精品久久久久影院老司 | 蝌蚪久久| 奇米影视9999 | 国产91福利 | 91久久国产视频 | 91精品国产综合久久久久久 | 三区四区 | 91亚洲国产成人久久精品网站 | 日韩精品五区 | 天天操天天操天天操天天操天天操 | www.com色 | 日韩久久精品 | 丰满的人妻hd高清日本 | 欧美亚洲国产精品 | 国产精品夫妻 | 亚洲综合网址 | 亚洲国产情侣 | jizz免费在线观看 | 黄色av网站在线看 | www.一区二区三区四区 | 成年人看的黄色片 | 精品国产视频一区二区三区 | 中文字幕色站 | 国产成人免费视频网站 | 欧美日韩一区二区在线观看 | 网站久久| 欧美手机看片 | 性色av一区二区三区免费 | 日少妇视频 |