面向切面編程_第1頁
面向切面編程_第2頁
面向切面編程_第3頁
面向切面編程_第4頁
面向切面編程_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第14章

面向切面編程SpringAOP簡介

面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足。除了類(classes)以外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。在AOP中,把分散程序各個部分,解決同樣問題的代碼片段,稱為問題的切面(或方面)。一個切面可以簡單的理解為解決跨越多個模塊的交叉關注點問題的模塊。通過AOP可以使用一種非常簡單、靈活的方式,在切面中實現(xiàn)了以前需要在各個核心關注點中穿插的交叉關注的功能,從而使得解決系統(tǒng)中交叉關注點問題的模塊更加容易設計、實現(xiàn)及維護。AOP相關框架及工具AspectJ:對java進行了擴展,形成一個功能強大、靈活、實用的AOP語言。AspectWerkz:一個動態(tài)、輕量級、性能表現(xiàn)良好的AOP框架。JBoss-AOP:JBoss公司開發(fā)的基于方法攔截及源碼級數(shù)據(jù)的AOP實現(xiàn)框架。

Spring-AOP:使用基于代理及攔截器的機制,與SpringIOC容器融入一體的AOP框架。

AOP中的五種AdviceAOP中的相關術語

1)關注點(Concern)

關注點也就是我們要考察或解決的問題。把一個系統(tǒng)中的核心功能稱為核心關注點跨越多個模塊的關注點稱為橫切關注點或交叉關注點(CrosscuttingConcerns)。在AOP的編程方法中,主要在于對關注點的提起及抽象。2)切面(Aspect)

切面是一個抽象的概念,從軟件的角度來說是指在應用程序不同模塊中的某一個領域或方面。

AOP中的切面(aspect)是實現(xiàn)世界領域問題的抽象,除了包括屬性、方法以外,同時切面中還包括切入點Pointcut、增強(advice)等。3)連接點(Joinpoint)

連接點也就是運用程序執(zhí)行過程中需要插入切面模塊的某一點。這個點可以是一個方法、一個屬性、構造函數(shù)、類靜態(tài)初始化塊,甚至一條語句。4)切入點(Pointcut)

切入點指一個或多個連接點,可以理解成一個點的集合。切入點的描述比較具體,而且一般會跟連接點上下文環(huán)境結合。5)增強或通知(Advice)

增強(Advice)里面定義了切面中的實際邏輯(即實現(xiàn)),即法增強(Advice)是指在定義好的切入點處,所要執(zhí)行的程序代碼。Spring的AOP簡介

AOP是Spring框架的重要組成部分。

SpringAOP使用純Java實現(xiàn),不需要專門的編譯過程。

Spring沒有像AspectJ那樣強大的功能,只支持與方法調用有關的連接點。

Spring中的AOP代理由Spring的Ioc容器負責生成、管理,其依賴關系也由Ioc容器負責管理。

AOP編程只需要程序員參加3個部分:定義普通業(yè)務組件定義切入點定義增強處理Spring有兩種方式定義切入點和增強處理:基于Annotation的方式:使用@Aspect、@PointCut等Annotation基于XML配置文件的管理方式:使用Spring的配置文件啟用@AspectJ支持為了在Spring配置中使用@AspectJaspects,必須首先啟用Spring對基于@AspectJaspects的配置支持,自動代理(autoproxying)基于通知是否來自這些切面。自動代理是指Spring會判斷一個bean是否使用了一個或多個切面通知,并據(jù)此自動生成相應的代理以攔截其方法調用,并且確認通知是否如期進行。

配置文件示例:

<?xmlversion="1.0"encoding="GBK"?><beansxmlns="http:///schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="http:///schema/context"xmlns:aop="http:///schema/aop"xsi:schemaLocation="http:///schema/beans/schema/beans/spring-beans-2.5.xsdhttp:///schema/context/schema/context/spring-context-2.5.xsdhttp:///schema/aop/schema/aop/spring-aop-2.5.xsd"><context:component-scanbase-package="lee"><context:include-filtertype="annotation"expression="org.aspectj.lang.annotation.Aspect"/></context:component-scan><aop:aspectj-autoproxy/></beans>Spring2支持的AspectJ標簽@Aspect-標識一個切面;@Pointcut-標識一個切入點;@Before-標識一個前置增強;@AfterReturning-標識返回后增強;@AfterThrowing-標識異常拋出增強;@After-標識后增強;@Around-標識環(huán)繞增強;1)定義切面Bean

當啟動了@AspectJ支持后,只要在Spring容器中配置一個@Aspect注釋的Bean,Spring將會自動識別該Bean,并將該Bean作為切面處理。例如:@AspectpublicclassAspectTest{}

注意:當使用@Aspect標注一個Java類后,Spring將不會把該Bean當成Bean組件處理。2)定義Before增強處理使用@Before標注。通常需要通過一個value屬性,指定一個切入點表達式,用于指定該增強處理將被織入哪些切入點。@AspectpublicclassBeforeAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@Before("execution(*lee.*.*(..))")publicvoidauthority(){System.out.println("模擬執(zhí)行權限檢查");}}

@ComponentpublicclassChineseimplementsPerson{publicStringsayHello(Stringname){returnname+"Hello,SpringAOP";}publicvoideat(Stringfood){System.out.println("我正在吃:"+food);}}該類可被無限地增強。3)After增強處理

使用@After標注。常用屬性:

value:指定該增強處理被織入的切入點。與AfterReturing的區(qū)別:

AfterReturing增強處理只有在目標方法成功完成后才會被織入,而After增強處理不管目標方法如何完成(包括成功完成和遇到異常),它都會被織入。

例如:@AspectpublicclassAfterAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@After("execution(*lee.*.*(..))")publicvoidrelease(){System.out.println("模擬方法結束后的釋放資源...");}}4)AfterReturning增強處理使用@AfterReturning標注,將在目標方法完成之后被織入。常用屬性:pointcut/value:用來指定該切入點對應的切入點表達式。returning:指定一個返回值形參名,增強處理定義的方法可以通過該形參名來訪問目標方法的返回值。例如:@AspectpublicclassAfterReturningAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@AfterReturning(pointcut="execution(*lee.*.*(..))",returning="rvt")publicvoidlog(Object

rvt){System.out.println("獲取目標方法返回值:"+rvt);System.out.println("模擬記錄日志功能...");}}5)定義AfterThrowing增強處理使用@AfterThrowing標注,主要用于處理程序中未處理的異常。常用屬性:pointcut/value:指定該切入點對應的切入表達式throwing:指定一個返回值形參名,增強處理定義的方法可以通過該形參名來訪問目標方法中所拋出的異常對象。例如:@AspectpublicclassAfterThrowingAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@AfterThrowing(pointcut="execution(*lee.*.*(..))",throwing="ex")publicvoiddoRecoveryActions(Throwableex){System.out.println("目標方法中拋出的異常:"+ex);System.out.println("模擬拋出異常后的增強處理...");}}

AOP的AfterThrowing處理與結構化異常處理的區(qū)別:catch捕捉意味著完全處理該異常,如果catch塊中沒有重新拋出新異常,則該方法可以正常結束。AfterThrowing處理雖然處理了該異常,但它不能完全處理該異常,該異常依然會向上傳播。6)Around增強處理

使用@Around標注。

Around增強處理功能更加強大,近似于Before和AfterReturing增強處理的總和。與Before和AfterReturing增強處理不同的是:Around增強處理甚至可以決定目標方法在什么時候被執(zhí)行,如何執(zhí)行,甚至可以完全阻止目標方法的執(zhí)行。

Around增強處理可以改變執(zhí)行目標方法的參數(shù)值,也可以改變執(zhí)行目標方法之后的返回值。例如:@AspectpublicclassAroundAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@Around("execution(*lee.*.*(..))")publicObjectprocessTx(ProceedingJoinPoint

jp)throwsjava.lang.Throwable{System.out.println("執(zhí)行目標方法之前,模擬開始事務...");//執(zhí)行目標方法,并保存目標方法執(zhí)行后的返回值Objectrvt=ceed(newString[]{"被改變的參數(shù)"});System.out.println("執(zhí)行目標方法之后,模擬結束事務...");returnrvt+"新增的內容";}}

Around增強處理需要通過value屬性指定該增強處理被織入的切入點。當定義Around增強處理方法時,該方法的第一個參數(shù)必須時ProceedingJoinPoint類型,在增強處理方法體內,調用ProceedingJoinPoint的proceed()方法才會執(zhí)行目標方法。調用proceed()時,還可以傳入一個Object[]對象,該數(shù)組中的值將被傳入目標方法作為執(zhí)行方法的實參。7)定義切入點

AspectJ和Spring都允許定義切入點。所謂定義切入點,實質就是為一個切入點表達式起一個名字,從而可以在多個增強處理中重用該名稱。切入點定義包括兩部分:一個切入點表達式一個包含名字和任意參數(shù)的方法簽名定義切入點使用@Pointcut標注@AspectpublicclassSystemArchitecture

{@Pointcut("execution(*lee.Chin*.say*(..))")publicvoidmyPointcut(){}}

若需要使用該切入點,則可在定義增強處理時使用pointcut參數(shù)。@AfterReturning(pointcut="SystemArchitecture.myPointcut()",returning="retVal")在下圖中展示了如何利用通配符,使多個切面同時使用一個定義。XML方式配置AOP1)定義切面使用<aop:aspect…/>元素。可在該元素中使用ref屬性為該切面Bean配置依賴注入。常用屬性:id:定義該切面的標識名ref:指定引用的SpringBean作為切面Beanorder:指定切面Bean的優(yōu)先級2)配置增強處理使用XML配置增強處理使用以下幾個元素:<aop:before…/><aop:after…/><aop:after-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論