黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spri

系統 2024 0

6.1.1? AOP是什么

? ? ? ? 考慮這樣一個問題:需要對系統中的某些業務做日志記錄,比如支付系統中的支付業務需要記錄支付相關日志,對于支付系統可能相當復雜,比如可能有自己的支付系統,也可能引入第三方支付平臺,面對這樣的支付系統該如何解決呢?

  • 傳統解決方案

? ? ? ? ? ? ? 1)日志部分提前公共類LogUtils,定義“longPayBegin”方法用于記錄支付開始日志,“logPayEnd”用于記錄支付結果:

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

????????????? 2)支付部分,定義IPayService接口并定義支付方法“pay”,并定義了兩個實現:“PointPayService”表示積分支付,“RMBPayService”表示人民幣支付;并且在每個支付實現中支付邏輯和記錄日志:

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

?????? ?????? 3)支付實現很明顯有重復代碼,這個重復很明顯可以使用模板設計模式消除重復:

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

?

4)到此我們設計了一個可以復用的接口;但大家覺得這樣記錄日志會很好嗎,有沒有更好的解決方案?

如果對積分支付方式添加統計功能,比如在支付時記錄下用戶總積分數、當前消費的積分數,那我們該如何做呢?直接修改源代碼添加日志記錄,這完全違背了面向對象最重要的原則之一:開閉原則(對擴展開放,對修改關閉)?

?

  • 更好的解決方案 :在我們的支付組件中由于使用了日志組件,即日志模塊橫切于支付組件,在傳統程序設計中很難將日志組件分離出來,即不耦合我們的支付組件;因此面向方面編程AOP就誕生了,它能分離我們的組件,使組件完全不耦合:

1)采用面向方面編程后,我們的支付組件看起來如下所示,代碼中不再有日志組件的任何東西;

?
【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

2)所以日志相關的提取到一個切面中,AOP實現者會在合適的時候將日志功能織入到我們的支付組件中去,從而完全解耦支付組件和日志組件。

?

看到這大家可能不是很理解,沒關系,先往下看。

?

?

面向方面編程(AOP):也可稱為面向切面編程,是一種編程范式,提供從另一個角度來考慮程序結構從而完善面向對象編程(OOP)。

?

?????? 在進行OOP開發時,都是基于對組件(比如類)進行開發,然后對組件進行組合,OOP最大問題就是無法解耦組件進行開發,比如我們上邊舉例,而AOP就是為了克服這個問題而出現的,它來進行這種耦合的分離。

?????? AOP為開發者提供一種進行橫切關注點(比如日志關注點橫切了支付關注點)分離并織入的機制,把橫切關注點分離,然后通過某種技術織入到系統中,從而無耦合的完成了我們的功能。

?

6.1.2? 能干什么

?????? AOP主要用于橫切關注點分離和織入,因此需要理解橫切關注點和織入:

  • 關注點: 可以認為是所關注的任何東西,比如上邊的支付組件;
  • 關注點分離: 將問題細化從而單獨部分,即可以理解為不可再分割的組件,如上邊的日志組件和支付組件;
  • 橫切關注點: 一個組件無法完成需要的功能,需要其他組件協作完成,如日志組件橫切于支付組件;
  • 織入: 橫切關注點分離后,需要通過某種技術將橫切關注點融合到系統中從而完成需要的功能,因此需要織入,織入可能在編譯期、加載期、運行期等進行。

橫切關注點可能包含很多,比如非業務的:日志、事務處理、緩存、性能統計、權限控制等等這些非業務的基礎功能;還可能是業務的:如某個業務組件橫切于多個模塊。如圖6-1

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

圖6-1 關注點與橫切關注點

?

?????? 傳統支付形式,流水方式:

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

?

?????? 面向切面方式,先將橫切關注點分離,再將橫切關注點織入到支付系統中:

【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3 ?

AOP能干什么:

  • 用于橫切關注點的分離和織入橫切關注點到系統;比如上邊提到的日志等等;
  • 完善OOP;
  • 降低組件和模塊之間的耦合性;
  • 使系統容易擴展;
  • 而且由于關注點分離從而可以獲得組件的更好復用。

?

6.1.3? AOP的基本概念

?????? 在進行AOP開發前,先熟悉幾個概念:

  • 連接點(Jointpoint ): 表示需要在程序中插入橫切關注點的擴展點,連接點可能是類初始化、方法執行、方法調用、字段調用或處理異常等等,Spring只支持方法執行連接點, AOP 中表示為“在哪里干”
  • 切入點(Pointcut ): 選擇一組相關連接點的模式,即可以認為連接點的集合,Spring支持perl5正則表達式和AspectJ切入點模式,Spring默認使用AspectJ語法, AOP 中表示為“在哪里干的集合”
  • 通知(Advice ): 在連接點上執行的行為,通知提供了在AOP中需要在切入點所選擇的連接點處進行擴展現有行為的手段;包括前置通知(before advice)、后置通知(after advice)、環繞通知(around advice),在Spring中通過代理模式實現AOP,并通過攔截器模式以環繞連接點的攔截器鏈織入通知; AOP 中表示為“干什么”;
  • 方面/ 切面(Aspect ): 橫切關注點的模塊化,比如上邊提到的日志組件。可以認為是通知、引入和切入點的組合;在Spring中可以使用Schema和@AspectJ方式進行組織實現; AOP 中表示為“在哪干和干什么集合”;
  • 引入(inter-type declaration ): 也稱為內部類型聲明,為已有的類添加額外新的字段或方法,Spring允許引入新的接口(必須對應一個實現)到所有被代理對象(目標對象), ? 在AOP 中表示為“干什么(引入什么)”
  • 目標對象(Target Object ): 需要被織入橫切關注點的對象,即該對象是切入點選擇的對象,需要被通知的對象,從而也可稱為“被通知對象”;由于Spring AOP 通過代理模式實現,從而這個對象永遠是被代理對象, AOP 中表示為“對誰干”
  • AOP 代理(AOP Proxy ): AOP框架使用代理模式創建的對象,從而實現在連接點處插入通知(即應用切面),就是 通過代理來對目標對象應用切面 。在Spring中,AOP代理可以用JDK動態代理或CGLIB代理實現,而通過攔截器模型應用切面。
  • 織入(Weaving ): 織入是一個過程,是將切面應用到目標對象從而創建出AOP代理對象的過程,織入可以在編譯期、類裝載期、運行期進行。

在AOP中,通過切入點選擇目標對象的連接點,然后在目標對象的相應連接點處織入通知,而切入點和通知就是切面(橫切關注點),而在目標對象連接點處應用切面的實現方式是通過AOP代理對象,如圖6-2所示。

【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

圖6-2 概念關系

接下來再讓我們具體看看Spring有哪些通知類型:

  • 前置通知(Before Advice ): 在切入點選擇的連接點處的方法之前執行的通知,該通知不影響正常程序執行流程(除非該通知拋出異常,該異常將中斷當前方法鏈的執行而返回)。
  • 后置通知(After Advice ): 在切入點選擇的連接點處的方法之后執行的通知,包括如下類型的后置通知:
    • 后置返回通知(After returning Advice ): 在切入點選擇的連接點處的方法正常執行完畢時執行的通知,必須是連接點處的方法沒拋出任何異常正常返回時才調用后置通知。
    • 后置異常通知(After throwing Advice ): ?在切入點選擇的連接點處的方法拋出異常返回時執行的通知,必須是連接點處的方法拋出任何異常返回時才調用異常通知。
    • 后置最終通知(After finally Advice ): ?在切入點選擇的連接點處的方法返回時執行的通知,不管拋沒拋出異常都執行,類似于Java中的finally塊。
  • 環繞通知(Around Advices ): 環繞著在切入點選擇的連接點處的方法所執行的通知,環繞通知可以在方法調用之前和之后自定義任何行為,并且可以決定是否執行連接點處的方法、替換返回值、拋出異常等等。

各種通知類型在UML序列圖中的位置如圖6-3所示:

? 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3

圖6-3 通知類型

?

6.1.4? AOP代理

?????? AOP代理就是AOP框架通過代理模式創建的對象,Spring使用JDK動態代理或CGLIB代理來實現,Spring缺省使用JDK動態代理來實現,從而任何接口都可別代理,如果被代理的對象實現不是接口將默認使用CGLIB代理,不過CGLIB代理當然也可應用到接口。

?

??????? AOP 代理的目的就是將切面織入到目標對象。

?

?????? 概念都將完了,接下來讓我們看一下AOP的 HelloWorld!吧。

?

原創內容 轉自請注明出處【 http://sishuok.com/forum/blogPost/list/2466.html

【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論