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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、AOP(Aspect Orient Programming )面向切面編程1、AOP的基本概念:AOP框架并不與特定的代碼耦合,AOP框架能處理程序執(zhí)行中特定的切入點(diǎn)(Pointcut),而不與具體某個(gè)類(lèi)耦合。AOP框架具有如下特征:1、各步驟之間的良好隔離性。2、源代碼無(wú)關(guān)性。AOP的專(zhuān)業(yè)術(shù)語(yǔ):1、Aspect(切面) : 應(yīng)用運(yùn)行過(guò)程中的關(guān)注點(diǎn),關(guān)注點(diǎn)可以橫切多個(gè)對(duì)象,被稱(chēng)為橫切關(guān)注點(diǎn)。2、pointcut(切入點(diǎn)):可插入增強(qiáng)處理的連接點(diǎn)。3、joinpoint(連接點(diǎn)):程序執(zhí)行過(guò)程中明確的點(diǎn),如方法的調(diào)用,或者異常的拋出。4、advice(增強(qiáng)處理):AOP框架特定的切入點(diǎn)執(zhí)行的增強(qiáng)

2、處理如何使用表達(dá)式來(lái)定義切入點(diǎn):1、引入:將方法或字段添加到被處理的類(lèi)中。2、目標(biāo)對(duì)象:被AOP框架進(jìn)行增強(qiáng)處理的對(duì)象,也被稱(chēng)為被增強(qiáng)的對(duì)象。如果AOP框架是通過(guò)運(yùn)行時(shí)代理來(lái)實(shí)現(xiàn)的,那么這個(gè)對(duì)象是一個(gè)被代理的對(duì)象。3、AOP代理:AOP框架創(chuàng)建的對(duì)象,簡(jiǎn)單的說(shuō),代理就是對(duì)目標(biāo)對(duì)象的增強(qiáng)。4、織入(Weaving):將增強(qiáng)處理添加到目標(biāo)對(duì)象中,并創(chuàng)建一個(gè)被增強(qiáng)的處理的過(guò)程就是織入。 2、Spring的 AOP支持在AOP編程,我們需要做如下三部分:1、定義普通組件。2、定義切入點(diǎn)、一個(gè)切入點(diǎn)可能橫切多個(gè)業(yè)務(wù)組件。3、定義增強(qiáng)處理,增強(qiáng)處理就是在AOP框架為普通業(yè)務(wù)組件織入的處理動(dòng)作。AOP編成的

3、關(guān)鍵是 定義切入點(diǎn) 和 定義增強(qiáng)處理,Spring依然有如下兩個(gè)方法來(lái)實(shí)現(xiàn):1、基于Annotation 的“零配置”方式。2、使用XML配置文件的管理方式。 3、基于Annotation 的“零配置”方式為了啟動(dòng)Spring對(duì)AspectJ切面配置的支持,并保證Spring容器中的目標(biāo)Bean被一個(gè)或多個(gè)切面自動(dòng)增強(qiáng),必須在Spring配置文件下配置如下代碼:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/sc

4、hema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop" xmlns:p="/schema/p" xsi:schemaLocation="/schema/beans /

5、schema/beans/spring-beans-2.0.xsd /schema/aop /schema/aop/spring-aop-3.0.xsd"> <!- 啟動(dòng)AspectJ支持-> <aop:aspectj-autoproxy /></beans>但是希望完全啟動(dòng)Spring的“零配置”功能,則配置代碼中還需添加:<?xml version="1.0" encoding="UTF-

6、8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:context="/schema/context" xmlns:aop="/schema/aop" xmlns:p="http:/

7、/schema/p" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.0.xsd /schema/aop /schema/aop/spring-aop-3.0.xsd http:/www.springframework.or

8、g/schema/context /schema/context/spring-context-3.0.xsd"> <!- 啟動(dòng)AspectJ支持-> <aop:aspectj-autoproxy /></beans> 這里給出下面 增強(qiáng)處理的目標(biāo)類(lèi):package org.service.imp;import org.service.Person;import org.springframework.stereotype.*;Componentpublic class Chinese

9、 implements Person public String sayHello(String name) / TODO Auto-generated method stub return name + "你好 , Spring Aop" public void eat(String food) / TODO Auto-generated method stub System.out.println("我正在吃:" + food) ; 3.1 定義切面Bean在啟動(dòng)AspectJ 支持以后,只要在Sping 容器中配置一個(gè)帶Aspect 注釋的Bean

10、 ,Spring將會(huì)自動(dòng)識(shí)別該Bean,并將該Bean作為切面處理。使用Aspect標(biāo)注一個(gè)Java類(lèi),該Java類(lèi)將會(huì)作為切面Bean Aspectpublic class AspectTest/定義類(lèi)的其他類(lèi)容 .3.2 定義Before增強(qiáng)處理使用Before來(lái)標(biāo)注一個(gè)方法,使該方法作為一個(gè)Before增強(qiáng)處理。使用Before標(biāo)注時(shí),通常需要指定一個(gè)value值,改值指定一個(gè)切入表達(dá)式,用于指定該增強(qiáng)處理將被織入哪些切入點(diǎn)。如:Before("execution(* blogs.jbelial.*.*(.)") 在被它標(biāo)注的方法將匹配blogs.jbelial包下的

11、所有類(lèi)的、所有方法的執(zhí)行作為切入點(diǎn)。如: package org.advice.Before;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;/定義一個(gè)切面Aspectpublic class BeforeAdviceTest /匹配該包下的所有類(lèi) Before( "execution(* org.service.imp.*.*(.)") public void authority() System.out.println("模擬執(zhí)行權(quán)限檢查&q

12、uot;) ; 注:在定義增強(qiáng)處理時(shí)的Spring配置文件如何配置,可以參考Spring 的“零配置”支持“ 的學(xué)習(xí)。3.3 定義AfterReturning增強(qiáng)處理類(lèi)似于使用Before ,使用AfterReturning 來(lái)標(biāo)注一個(gè)增強(qiáng)處理,該增強(qiáng)處理將會(huì)在目標(biāo)方法正常完成后被織入。在使用AfterReturning Annotation時(shí)可以指定如下兩個(gè)常量屬性。1、pointcut/value : 用于指定切入點(diǎn)對(duì)于的表達(dá)式。2、returning :制定一個(gè)返回值形參名,增強(qiáng)處理定義的方法可以通過(guò)該形參名來(lái)訪問(wèn)目標(biāo)方法的返回值。如:AfterReturning(returning =

13、"rvt" , pointcut = "execution(* blogs.jbelial.*.*(.)") ; 指定一個(gè) returning 屬性,該屬性值為 rvt , 表示 允許在 增強(qiáng)處理方法中使用名為rvt的形參,該形參代表目標(biāo)方法的返回值。AfterReturning Annotation 的 returning 屬性所制定的的形參名必須對(duì)應(yīng)于增強(qiáng)處理中的一個(gè)形參名。當(dāng)目標(biāo)方法執(zhí)行返回后,返回值作為相應(yīng)的參數(shù)值傳入增強(qiáng)處理的方法。如下:package org.advice.AfterReturning;import org.aspectj.l

14、ang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;Aspectpublic class AfterReturningAdivceTest AfterReturning( returning = "rvt" , pointcut = "execution(* org.service.imp.*.*(.)") public void log(Object rvt) System.out.println("獲取目標(biāo)方法返回值:"+rvt) ; Sy

15、stem.out.println("模擬記錄日志功能.") ; 3.4 定義AfterThrowing 增強(qiáng)處理:AfterThrowing 增強(qiáng)處理主要用于處理程序中未處理的異常。AfterThrowing Annotation 兩個(gè)常用的屬性: > pointcut/value : 如上。 > throwing : 指定一個(gè)返回參數(shù)名,增強(qiáng)處理定義的方法可通過(guò)該形參名來(lái)訪問(wèn)目標(biāo)方法中所拋出的異常對(duì)象。如:AfterThrowing(throwing = "ex" ,pointcut = "execution(* blogs.jb

16、elial.*.*(.)")3.5 After 增強(qiáng)處理:After 與 AfterReturning 的區(qū)別:After : 增強(qiáng)處理不管目標(biāo)方法如何結(jié)束,他都會(huì)被織入。因此,After 增強(qiáng)處理必須準(zhǔn)備處理正常返回和異常返回兩種情況,這種增強(qiáng)處理通常用于釋放資源。AfterReturning : 增強(qiáng)處理只有在目標(biāo)方法成功完成才會(huì)被織入。如下: package org.advice.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.After;Aspectpubli

17、c class AfterAdviceTest After ("execution(* org.service.imp.*.*(.)") public void release() System.out.println("模擬方法結(jié)束后的釋放資源."); 3.6 Around 增強(qiáng)處理 : Around 增強(qiáng)處理既可以在執(zhí)行目標(biāo)方法之前織入增強(qiáng)處理,可以在執(zhí)行目標(biāo)方法之后織入增強(qiáng)動(dòng)作。同時(shí),Around 增強(qiáng)處理甚至可以決定目標(biāo)方法在什么時(shí)候執(zhí)行,如何執(zhí)行,甚至可以完全阻止目標(biāo)方法的執(zhí)行。 Around 增強(qiáng)處理可以改變執(zhí)行目標(biāo)方法的參數(shù)值,也可以改變執(zhí)

18、行目標(biāo)方法之后的返回值。 當(dāng)定義一個(gè) Around 增強(qiáng)處理方法時(shí),該方法的第一個(gè)形參必須是 ProceedingJoinPoint 類(lèi)型,調(diào)用 ProceedingJoinPoint 的 proceed() 方法才會(huì)執(zhí)行目標(biāo)方法。如下: package org.advice.Around; import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;Aspectpublic class AroundAdviceTest Around ( "execution(* org.servi

19、ce.imp.*.*(.)") public void processText(ProceedingJoinPoint PJ) throws Throwable System.out.println("執(zhí)行目標(biāo)方法之前,模擬開(kāi)始事務(wù)。"); PJ.proceed() ; System.out.println("執(zhí)行目標(biāo)方法之后,模擬結(jié)束事務(wù)。"); 3.7 訪問(wèn)目標(biāo)方法的參數(shù):訪問(wèn)目標(biāo)方法的做法是定義增強(qiáng)處理時(shí)將第一個(gè)參數(shù)定義為JoinPoint 類(lèi)型,當(dāng)該增強(qiáng)處理方法被調(diào)用時(shí),該JoinPoint 參數(shù)就代表了織入增強(qiáng)處理的連接點(diǎn)。該Join

20、Point 里包含了如下常用的方法:> Object getArgs() : 返回執(zhí)行目標(biāo)方法時(shí)的參數(shù)。> Signature getSignature() : 返回被增強(qiáng)的方法的相關(guān)信息。> Object getTarget() : 返回被織入增強(qiáng)處理的目標(biāo)對(duì)象。> Object getThis() : 返回AOP框架為目標(biāo)的相關(guān)信息。注意:ProceedingJoinPoint 該類(lèi)是JoinPoint 的子類(lèi)。 3.8 定義切入點(diǎn):為一個(gè)切入表達(dá)式起一個(gè)名稱(chēng),從而允許在多個(gè)增強(qiáng)處理中重用該名稱(chēng)。Spring AOP 只支持以Spring Bean 的方法執(zhí)行組 作

21、為連接點(diǎn),所以可以把切入點(diǎn)看錯(cuò)所有能和切入表達(dá)式匹配的Bean 方法。切入點(diǎn)定義包含兩個(gè)部分:> 一個(gè)切入點(diǎn)表達(dá)式。> 一個(gè)包含名字和任意參數(shù)的方法簽名。如下: package org.advice.AfterReturning;import org.aspectj.lang.annotation.*;Aspectpublic class adviceExpression Pointcut("execution(* org.service.imp.*.*(.)") public void test() 注意:上面代碼中的 test方法的返回值必須是void ,

22、且當(dāng)用private 訪問(wèn)控制符修飾時(shí),則僅能在切面類(lèi)中使用該切入點(diǎn)。package org.advice.AfterReturning;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect; Aspectpublic class AfterReturningAdivceTest AfterReturning( returning = "rvt" , pointcut = "adviceExpression.test()") public void log(Object rvt) System

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論