程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [Spring實戰系列](16)面向切面編程(AOP)概述

[Spring實戰系列](16)面向切面編程(AOP)概述

編輯:JAVA綜合教程

[Spring實戰系列](16)面向切面編程(AOP)概述


1. 簡介

  在軟件中,有些行為對於大多數應用都是通用的。日志,安全和事務管理的確很重要,但他們是都是應用對象主動參與的行為呢?如果讓應用對象只關注自己所針對的業務領域問題,而其他方面的問題由其他應用對象來處理,這樣會不會更好?   在軟件開發中,分布於應用中多處的功能被稱為橫切關注點。通常,這些橫切關注點從概念上是與應用的業務邏輯相分離的(但是往往直接嵌入到應用的業務邏輯中)。將這些橫切關注點與業務邏輯相分離是面向切面編程索要解決的。   上圖展示了一個被劃分為模塊的典型應用。每個模塊的核心功能都是為特定業務領域提供服務,但是這些模塊都需要類似的輔助功能,例如安全和事務管理。   繼承與委托是最常見的實現重用通用功能的面向對象技術。但是,如果在整個應用中使用相同的基類,繼承往往會導致一個脆弱的對象體系;而使用委托可能需要委托對象進行復雜的調用。切面提供了取代繼承與委托的另一種選擇。在使用面向切面編程時,我們讓然在一個地方定義通用功能,但是我們可以通過聲明的方式定義這個功能以何種方式在何處應用,而無需修改受影響的類。

2. 幾個AOP概念

描述AOP功能的術語並不直觀,在這共同學習一下。 \
2.1 通知 在AOP術語中,切面的工作被稱為通知。通知定義了切面是什麼以及何時使用。除了描述切面要完成的工作,通知還解決了何時執行這個工作的問題。它該應用與某個方法被調用之前?之後?   類型 說明 Before 在方法被調用之前調用通知。 After 在方法完成之後調用通知,無論方法執行是否成功。 After-returning 在方法成功執行之後調用通知。 After-throwing 在方法拋出異常後調用通知。 Around 通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為。
2.2 連接點
連接點是在應用執行過程中能夠插入切面的一個點。這個點可以是調用方法時,拋出異常時,甚至修改一個字段時。切面代碼可以利用這些點插入到應用的正常流程之中,並添加新的行為
2.3 切點
一個切面並不需要通知應用的所有連接點。切點有助於縮小切面所通知連接點的范圍。
2.4 切面
切面是通知和切點的結合。通知和切點共同定義了關於切面的全部內容-----它是什麼,在何時和在何處完成其功能。
2.5 引入
引入允許我們向現有的類添加新方法或屬性。例如,我們可以創建一個Auditable通知類,該類記錄了對象最後一次修改時的狀態。我們只需一種方法,setLastModified(Date),和一個實例變量來保存這個狀態。然後,這個新方法和實例變量就可以被引入到現有的類中。從而可以在無需修改這些現有的類的情況下,讓他們具有新的行為和狀態。
2.6 織入
織入是將切面應用到目標對象來創建新的代理對象的過程。切面在指定的連接點被織入到目標對象中。在目標對象的生命周期裡有多個點可以進行織入。

3. Spring對AOP的支持

  並不是所有的AOP框架都是一樣的,盡管有些不同,但是無論如何,創建切點來定義切面織入的連接點是AOP框架的基本功能。   現在主要的AOP框架:
  • AspecJ
  • JBoss AOP
  • Spring AOP  
在這裡我們主要看Spring對AOP的支持,Spring提供了4種各具特色的AOP支持:
  • 基於代理的經典AOP
  • @AspectJ注解驅動的切面
  • 純POJO切面
  • 注入式AspectJ切面(適合Spring各版本)
3.1 Spring通知是Java編寫的
Spring所創建的通知都是用標准的Java類編寫的。這樣的話,我們就可以使用與普通Java開發一樣的集成開發環境(IDE)來開發切面。而且,定義通知所應用的切點通常在Spring配置文件裡采用XML來編寫的。AspectJ與之相反,雖然AspectJ現在支持基於注解的切面,但是AspectJ最初是以Java語言擴展的方式實現的。這種方式既有優點也有缺點。通過特有的AOP語言,我們可以獲得更強大和細粒度的控制,以及更豐富的AOP工具集,但是需要我們學習額外的新工具和語法。
3.2 Spring在運行期通知對象
通過在代理類中包裹切面,Spring在運行期將切面織入到Spring管理的Bean中。代理類封裝了目標類,並攔截被通知的方法的調用,再將調用轉發給真正的目標Bean。 \ 當攔截到方法調用時,在調用目標Bean方法之前,代理會執行切面邏輯。知道應用需要被代理的Bean時,Spring才創建代理對象。如果使用的是ApplicationContext,在ApplicationContext從BeanFactory中加載所有的Bean時,Spring創建被代理的對象。因為Spring運行時才創建代理對象,所以我們不需要對特殊的編譯器來織入Spring AOP的切面。
3.3 Spring只支持方法連接點
因為Spring是基於動態代理的,所以Spring只支持方法連接點。這與其他一些AOP架構是不同的,例如AspectJ和JBoss,除了方法切點,它們還提供字段和構造器接入點。Spring缺少字段連接點的支持,無法創建更細粒度的通知,例如攔截對象字段的修改,而且Spring也不支持構造器連接點,我們也無法在Bean創建時應用通知。 來源於:《Spring實戰》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved