版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
8.1AOP概述8.1.1AOP的術(shù)語切面(Aspect):描述的是一個(gè)應(yīng)用系統(tǒng)的某一個(gè)方面或領(lǐng)域,例如:日志,事務(wù),權(quán)限檢查等。連接點(diǎn)(Joinpoint):連接點(diǎn)是應(yīng)用程序執(zhí)行過程中插入切面的點(diǎn),這些點(diǎn)可能是方法的調(diào)用,異常拋出或字段的修改等。Spring只支持方法的Joinpoint,也就是Advice將在方法執(zhí)行的前后被應(yīng)用。通知(Advice):表示切面的行為,具體表現(xiàn)為實(shí)現(xiàn)切面邏輯的一個(gè)方法。常見通知有:before、after及around等。切入點(diǎn)(Pointcut):切入點(diǎn)指定了通知應(yīng)當(dāng)應(yīng)用在哪些連接點(diǎn)上,Pointcut切點(diǎn)通過正則表達(dá)式定義方法集合。切入點(diǎn)由一系列切入點(diǎn)指示符通過邏輯運(yùn)算組合得到,AspeetJ的常用切入點(diǎn)指示符包括:execution、call、initialization、handler、get、set、this、target、args、within等。目標(biāo)對象(Target):目標(biāo)對象是指被通知的對象。注意,Spring中,Target必須實(shí)現(xiàn)預(yù)先定義好的接口,這樣才會使用Proxy進(jìn)行動(dòng)態(tài)代理。代理(Proxy):代理是指將通知應(yīng)用到目標(biāo)對象后形成的新的對象。它實(shí)現(xiàn)了與目標(biāo)對象一樣的功能,在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或CGLIB代理。如果目標(biāo)對象沒有實(shí)現(xiàn)任何接口,那么Spring將使用CGLIB來實(shí)現(xiàn)代理。如果目標(biāo)對象實(shí)現(xiàn)了一個(gè)以上的接口,那么Spring將使用JDKProxy來實(shí)現(xiàn)代理,因?yàn)镾pring默認(rèn)使用的就是JDKProxy,這符合Spring提倡面向接口編程的思想??椚?Weaving):織入是指將切面應(yīng)用到目標(biāo)對象從而建立一個(gè)新的代理對象的過程,切面在指定的接入點(diǎn)被織入目標(biāo)對象中,織入一般可發(fā)生在對象的編譯期,類裝載期或運(yùn)行期,而Spring的AOP采用的是運(yùn)行期織入。8.1.2AOP的優(yōu)點(diǎn)
(1)代碼集中。解決了由于OOP跨模塊造成的代碼糾纏和代碼分散問題。
(2)模塊化橫切關(guān)注點(diǎn)。核心業(yè)務(wù)級關(guān)注點(diǎn)與橫切關(guān)注點(diǎn)分離開,降低橫切模塊與核心模塊的耦合度,實(shí)現(xiàn)了軟件工程中的高內(nèi)聚、低耦合的要求。增強(qiáng)了程序的可讀性,并且使系統(tǒng)更容易維護(hù)。
(3)系統(tǒng)容易擴(kuò)展。AOP的基本業(yè)務(wù)模塊不知道橫切關(guān)注點(diǎn)的存在,很容易通過建立新的切面加入新的功能。另外,當(dāng)系統(tǒng)中加入新的模塊時(shí),已有的切面自動(dòng)橫切進(jìn)來,使系統(tǒng)易于擴(kuò)展。
(4)提高代碼重用性。AOP把每個(gè)Aspect實(shí)現(xiàn)為獨(dú)立的模塊,模塊之間松散藕合,意味著更高的代碼重用性。8.1.3AspectJ的切點(diǎn)表達(dá)式函數(shù)AspectJ的切點(diǎn)表達(dá)式由關(guān)鍵字和操作參數(shù)組成,例如,以下切點(diǎn)表達(dá)式:execution(*chapter8.moniter.print(..))為了描述方便,不妨將execution()稱作函數(shù),而將匹配串稱作函數(shù)的入?yún)ⅰG腥氡磉_(dá)式中特殊符號. 匹配除換行符外的任意單個(gè)字符* 匹配任何類型的參數(shù)串.. 匹配任意的參數(shù),0到多個(gè)。Spring支持9個(gè)@AspectJ切點(diǎn)表達(dá)式函數(shù),類別函數(shù)入?yún)⒄f明方法切點(diǎn)函數(shù)execution()方法匹配模式串表示滿足某一匹配模式的所有目標(biāo)類方法連接點(diǎn)。@annotation()方法注解類名表示標(biāo)注了特定注解的目標(biāo)方法連接點(diǎn)。方法入?yún)⑶悬c(diǎn)函數(shù)args()類名通過判別目標(biāo)類方法運(yùn)行時(shí)入?yún)ο蟮念愋投x指定連接點(diǎn)。@args()類型注解類名通過判別目標(biāo)方法的運(yùn)行時(shí)入?yún)ο蟮念愂欠駱?biāo)注特定注解來指定連接點(diǎn)。目標(biāo)類切點(diǎn)函數(shù)within()類名匹配串限制在特定域下的所有連接點(diǎn)。如within(ecjtu.service.*)表示ecjtu.service包中的所有連接點(diǎn),即包中所有類的所有方法。target()類名限制匹配的連接點(diǎn)其對應(yīng)的被代理的目標(biāo)對象為給定類型的實(shí)例。@within()類型注解類名如@within(ecjtu.Monitor)定義的切點(diǎn),假如Y類標(biāo)注了@Monitor注解,則Y的所有連接點(diǎn)都匹配這個(gè)切點(diǎn)。@target()類型注解類名目標(biāo)類標(biāo)注了特定注解,則目標(biāo)類所有連接點(diǎn)匹配該切點(diǎn)。代理類切點(diǎn)函數(shù)this()類名限制匹配的連接點(diǎn)其對應(yīng)的SpringAOP代理Bean引用為給定類型的實(shí)例。execution(*set*(..))表示執(zhí)行任何以set作為前綴的方法。within(com.service.*)表示執(zhí)行service包中的任何連接點(diǎn)的方法。this(com.service.AccountService)表示以AccountService接口對象作為代理的連接點(diǎn)在SpringAOP中執(zhí)行。另外,SpringAOP還提供了名為bean切點(diǎn)指示符,用于指定Bean實(shí)例的連接點(diǎn)。定義表達(dá)式時(shí)需要傳入Bean的id或name。表達(dá)式參數(shù)允許使用“*”通配符。例如,bean(*book)表示匹配所有名字以book結(jié)尾的Bean。要匹配Bean的某個(gè)方法可以通過args參數(shù)進(jìn)行指定。例如:
@Before("bean(sampleBean)&&args()")表示給sampleBean所代表對象的所有無參方法執(zhí)行前加入切面邏輯。8.2簡單AOP應(yīng)用示例1.配置文件<context:component-scanbase-package="chapter8"/><aop:aspectj-autoproxy/><beanid="sampleBean"class="chapter8.work"/>2.業(yè)務(wù)邏輯接口【程序清單8-2】文件名為Sample.javapackagechapter8;publicinterfaceSample{ publicvoidsome();publicvoidother(Strings)throwsException;}注意,為了讓Spring自動(dòng)利用JDK的代理功能,定義接口有必要。用接口定義業(yè)務(wù)規(guī)范也是良好的程序設(shè)計(jì)風(fēng)格。3.業(yè)務(wù)邏輯實(shí)現(xiàn)【程序清單8-3】業(yè)務(wù)邏輯實(shí)現(xiàn)(文件名為work.java)packagechapter8;publicclassworkimplementsSample{ publicvoidsome(){ System.out.println("dosomething.."); }publicvoidother(Strings)throwsException{System.out.println(s); thrownewException("somethingiswrong."); } }4.切面邏輯packagechapter8;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.*importorg.springframework.stereotype.Component;@Aspect@Component//實(shí)現(xiàn)切面在IOC容器中的注冊publicclassAspectlogic{/*聲明BeforeAdvice,并直接指定切入點(diǎn)表達(dá)式,也就是chapter8包下work類的some方法作為切入點(diǎn),在該方法執(zhí)行前執(zhí)行切面邏輯*/
@Before("execution(*chapter8.work.some(..))")
publicvoidexecute(){//切面邏輯的方法
System.out.println("BeforeMethodstartedexcuting...");}}也可以先用@Pointcut定義切入點(diǎn)表達(dá)式,再將其應(yīng)用到通知定義中,這樣的好處是一次定義,以后可多處使用,具體代碼如下:publicclassAspectlogic{//定義切入點(diǎn)@Pointcut("execution(*chapter8.work.some(..))")publicvoidmypoint(){}//用來標(biāo)注切入點(diǎn)的方法必須是一個(gè)空方法
//以下利用切入點(diǎn)定義Before通知@Before("mypoint()")//也可寫成:@Before(pointcut="mypoint()")
publicvoidexecute(){//切面邏輯的方法System.out.println("BeforeMethodstartedexcuting...");}}【輸出結(jié)果】運(yùn)行Tester應(yīng)用程序,結(jié)果如下:BeforeMethodstartedexcuting...dosomething..hellohaveException!5.測試調(diào)用publicclassTester{ publicstaticvoidmain(String[]args){ ApplicationContextcontext=new ClassPathXmlApplicationContext("adviceContext.xml"); Samplesample=(Sample)context.getBean("sampleBean");
sample.some();try{
sample.other("hello"); }catch(Exceptione){System.out.println("haveException!");} }}8.3Spring切面定義說明8.3.1Spring的通知類型Spring可定義5類通知。它們是:Before通知AfterReturning通知AfterThrowing通知After通知Around通知。在同時(shí)定義了多個(gè)通知時(shí),通知的執(zhí)行次序與優(yōu)先級有關(guān),以下為通知優(yōu)先級由低到高的順序:Before通知--->Around通知--->AfterReturning通知--->After通知
在定義Around通知的切面邏輯方法時(shí),必須給方法至少加入ProceedingJoinPoint類型的參數(shù),在方法內(nèi)調(diào)用ProceedingJoinPoint的proceed()方法才會執(zhí)行目標(biāo)方法。調(diào)用ProceedingJoinPoint的proceed()方法時(shí),還可以傳入一個(gè)Object[]對象,該數(shù)組中的數(shù)據(jù)將作為目標(biāo)方法的實(shí)參。以下為具體舉例:@Around(value="mypoint()")publicObjectprocess(ProceedingJoinPointpj){ Objectres=null; try{ res=ceed(newString[]{"新參數(shù)"}); }catch(Throwablee){ e.printStackTrace(); } System.out.println("結(jié)果="+res); returnres+"更改";}8.3.2訪問目標(biāo)方法的參數(shù)訪問目標(biāo)方法最簡單的做法是在定義通知時(shí)將第一個(gè)參數(shù)定義為JoinPoint類型的參數(shù),該JoinPoint參數(shù)就代表了織入通知的連接點(diǎn),JoinPoint內(nèi)包含如下常用方法,通過它們可傳遞信息:Object[]getArgs():返回執(zhí)行目標(biāo)方法時(shí)的參數(shù);SignaturegetSignature():返回切面邏輯方法的相關(guān)信息;ObjectgetTarget():返回被織入切面邏輯的目標(biāo)對象;ObjectgetThis():返回AOP框架為目標(biāo)對象生成的代理對象。獲取目標(biāo)方法的相關(guān)信息@After("mypoint()")publicvoidexecute2(JoinPointjp)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 16 太陽 教案 統(tǒng)編版五年級語文上冊
- 2024年九年級道德與法治下冊 第一單元 我們共同的世界 第一課 同住地球村 第2框 復(fù)雜多變的關(guān)系說課稿 新人教版
- 2 學(xué)會寬容 第一課時(shí) 說課稿-2023-2024學(xué)年道德與法治六年級下冊統(tǒng)編版
- 2025如何寫農(nóng)村土地承包合同范文
- 2025服裝代理商合同協(xié)議書范本
- 2《花的學(xué)?!氛f課稿-2024-2025學(xué)年統(tǒng)編版語文三年級上冊
- 隧道拆除專項(xiàng)施工方案
- 2024年五年級數(shù)學(xué)上冊 二 小數(shù)乘法 2小數(shù)的乘法第2課時(shí) 小數(shù)乘小數(shù)說課稿 冀教版
- 軍訓(xùn)訓(xùn)合同范例
- 黔江辦公室鋁扣板施工方案
- 做投標(biāo)文件培訓(xùn)
- 9.4+跨學(xué)科實(shí)踐:制作簡易活塞式抽水機(jī)課件+-2024-2025學(xué)年人教版物理八年級下冊
- 建筑工程工作計(jì)劃
- 2025年中國國際投資促進(jìn)中心限責(zé)任公司招聘管理單位筆試遴選500模擬題附帶答案詳解
- 瓶裝液化氣送氣工培訓(xùn)
- 外科護(hù)理課程思政課程標(biāo)準(zhǔn)
- 船舶航行安全
- 道德經(jīng)全文完整版本
- 9.2溶解度(第1課時(shí)飽和溶液不飽和溶液)+教學(xué)設(shè)計(jì)-2024-2025學(xué)年九年級化學(xué)人教版(2024)下冊
- 2024年審計(jì)局公務(wù)員招錄事業(yè)單位招聘考試招錄139人完整版附答案【研優(yōu)卷】
- 濰坊市人民醫(yī)院招聘真題
評論
0/150
提交評論