SpringAOP學(xué)習(xí)小結(jié)_第1頁
SpringAOP學(xué)習(xí)小結(jié)_第2頁
SpringAOP學(xué)習(xí)小結(jié)_第3頁
SpringAOP學(xué)習(xí)小結(jié)_第4頁
SpringAOP學(xué)習(xí)小結(jié)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一、AOP 概念 Joinpoint:它定義在哪里加入你的邏輯功能,對于Spring AOP,Jointpoint指的就是Method。 Advice:特定的Jointpoint處運行的代碼,對于Spring AOP 來講,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。 Pointcut:一組Joinpoint,就是說一個Advice可能在多個地方織入, Aspect:這個我一直迷惑,它實際是Advice和Pointcut的組合,但是Spring AOP 中的Advisor也是這樣

2、一個東西,但是Spring中為什么叫Advisor而不叫做Aspect。 Weaving:將Aspect加入到程序代碼的過程,對于Spring AOP,由ProxyFactory或者ProxyFactoryBean負責(zé)織入動作。 Target:這個很容易理解,就是需要Aspect功能的對象。 Introduction:引入,就是向?qū)ο笾屑尤胄碌膶傩曰蚍椒?,一般是一個實例一個引用對象。當然如果不引入屬性或者引入的屬性做了線程安全性處理或者只讀屬性,則一個Class一個引用也是可以的(自己理解)。Per-class lifecycle or per-instance life cycle 二、AO

3、P 種類 1、靜態(tài)織入:指在編譯時期就織入Aspect代碼,AspectJ好像是這樣做的。 2、動態(tài)織入:在運行時期織入,Spring AOP屬于動態(tài)織入,動態(tài)織入又分靜動兩種,靜則指織入過程只在第一次調(diào)用時執(zhí)行;動則指根據(jù)代碼動態(tài)運行的中間狀態(tài)來決定如何操作,每次調(diào)用Target的時候都執(zhí)行(性能較差)。 三、Spring AOP 代理原理 Spring AOP 是使用代理來完成的,Spring 會使用下面兩種方式的其中一種來創(chuàng)建代理: 1、JDK動態(tài)代理,特點只能代理接口,性能相對較差,需要設(shè)定一組代理接口。 2、CGLIB 代理,可代理接口和類(final method除外),性能較高(

4、生成字節(jié)碼)。 四、Spring AOP 通知類型 1、BeforeAdvice:前置通知需實現(xiàn)MethodBeforeAdvice,但是該接口的Parent是BeforeAdvice,致于什么用處我想可能是擴展性需求的設(shè)計吧?;蛘逽pring未來也并不局限于Method的JoinPoint(胡亂猜測)。BeforeAdvice可以修改目標的參數(shù),也可以通過拋出異常來阻止目標運行。 2、AfterreturningAdvice:實現(xiàn)AfterreturningAdvice,我們無法修改方法的返回值,但是可以通過拋出異常阻止方法運行。 3、AroundAdvice:Spring 通過實現(xiàn)Meth

5、odInterceptor(aopalliance)來實現(xiàn)包圍通知,最大特點是可以修改返回值,當然它在方法前后都加入了自己的邏輯代碼,因此功能異常強大。通過MethodIceed()來調(diào)用目標方法(甚至可以不調(diào)用)。 4、ThrowsAdvice:通過實現(xiàn)若干afterThrowing()來實現(xiàn)。 5、IntroductionInterceptor:Spring 的默認實現(xiàn)為DelegatingIntroductionInterceptor 五、Spring AOP Pointcut 以上只是Advice,如果不指定切入點,Spring 則使用所有可能的Jointpo

6、int進行織入(當然如果你在Advice中進行方法檢查除外)。因此切入點在AOP中扮演一個十分重要的角色。Spring 2.0 推薦使用AspectJ的Annocation的切入點表達式來定義切入點,或者使用來定義AOP,這方面本篇不做考慮。 1、Pointcut:它是Spring AOP Pointcut的核心,定義了getClassFilter()和getMethodMatcher()兩個方法。 2、ClassFilter:定義了matches(Class cls)一個方法。 3、MethodMatcher() 定義了matches(Method,Class),isRuntime(),ma

7、tches(Mathod,Class,Object)三個方法,如果isRuntime()返回true則表示為動態(tài)代理(實際是動態(tài)代理的動態(tài)代理),則調(diào)用第三個方法(每訪問一次調(diào)用一次),否則調(diào)用第一個方法(并且只調(diào)用一次) 4、Spring AOP靜態(tài)切入點的幾個實現(xiàn)。 ComposablePointcut 太復(fù)雜一個切入點無法表達就用這個,union MethodMatcher和ClassFilter或者intersection MethodMatcher、ClassFilter和Pointcut。為什么不實現(xiàn)union Pointcut? 而只能通過Pointcuts類對Pointcut進

8、行union操作。 ControlFlowPointcut 想對程序的運行過程進行追蹤就用這個 DynamicMatchMatcherPointcut 想用動態(tài)AOP 就用這個 JdkRegexpMethodPointcut 想使用正則表達式就用這個 Perl5RegexpMethodPointcut NameMatchMethodPointcut 想用方法名字來匹配就用這個 StaticMethodMatcherPointcut 靜態(tài)切入點就用這個 沒有人反對你直接實現(xiàn)Pointcut:)。 六、Spring AOP 中的Advisor其實就是Aspect 1、 PointcutAdviso

9、r 其實一般使用DefaultPointcutAdvisor就足夠了,給它Advice和Pointcut。 當然如果想少寫那么幾行代碼也可以使用NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor等。 更多Advisor可以查看API文檔。 2、 IntroductionAdvisor 默認實現(xiàn)為DefaultIntroductionAdvisor。 七、AOP ProxyFactory 使用代碼實現(xiàn)AOP 可使用ProxyFactory 聲明式AOP 可使用ProxyFactoryBean ProxyFactoryBean 需要

10、設(shè)定 target,interceptorNames(可以是Advice或者Advisor,注意順序) 對接口代理需設(shè)置proxyInterfaces 八、自動代理 BeanNameAutoProxyCreator Java代碼 1. 2. jdk*,onlyJdk 3. 4. 5. myInterceptor 6. 7. 8. jdk*,onlyJdkmyInterceptorDefaultAdvisorAutoProxyCreator Java代碼 1. 2. 3. 4. 5. 6. 7. 8. 9. 九、Spring 2.0 AOP 略 以上為本人這段時間來看Spring AOP的一些學(xué)

11、習(xí)體會,有什么說的不對的地方請批評指正。嘿,樓主給出了所有的概念,我想在這里給一個完整的例子,以幫助初學(xué)者更好地理解, 你們可以先不必理會上面的概念,等運行這個例子后,再慢慢地做照著理解。 我使用的是Spring 2.0 的APO, 它引入了一種更加簡單并且更強大的方式來定義切面。 馬上開始吧: 首先建一個普通Java項目:com.longthsoft.learn.spring 把 spring.jar, commons-logging.jar, cglib-nodep-.jar, aspectjweaver.jar, aspectjrt.jar 放到 Build Path 下. 以止 lib

12、 除了 spring 外, 其他的都可以在 spring 下載包的 lib 中找到 下面編碼開始: 讓我們先寫兩個簡單的類: Java代碼 1. packagecom.longthsoft.learn.spring.models; 2. 3. publicclassA 4. publicvoidsayHello() 5. System.out.println(Hello,Ima); 6. 7. package com.longthsoft.learn.spring.models;public class A public void sayHello() System.out.println(H

13、ello, Im a);Java代碼 1. packagecom.longthsoft.learn.spring.models; 2. 3. publicclassB 4. publicvoidsayHi() 5. System.out.println(Hi,Imb); 6. 7. package com.longthsoft.learn.spring.models;public class B public void sayHi() System.out.println(Hi, Im b);沒什么實際的東西, 只是小A和小B在打招呼 接下來把他們交給Spring吧(有點殘忍)。 Java代碼

14、 1. 2. 8. 9. 10. 11. 接下來寫個Boot Java代碼 1. packagecom.longthsoft.learn.spring; 2. 3. importorg.springframework.context.ApplicationContext; 4. importorg.springframework.context.support.ClassPathXmlApplicationContext; 5. 6. importcom.longthsoft.learn.spring.models.A; 7. importcom.longthsoft.learn.spring

15、.models.B; 8. 9. publicfinalclassBoot 10. 11. publicstaticvoidmain(Stringargs) 12. ApplicationContextctx=newClassPathXmlApplicationContext(applicationContext.xml); 13. Aa=(A)ctx.getBean(a); 14. a.sayHello(); 15. 16. Bb=(B)ctx.getBean(b); 17. b.sayHi(); 18. 19. 20. package com.longthsoft.learn.spring

16、;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.longthsoft.learn.spring.models.A;import com.longthsoft.learn.spring.models.B;public final class Boot public static void main(String args) ApplicationContext ctx

17、 = new ClassPathXmlApplicationContext(applicationContext.xml);A a = (A) ctx.getBean(a);a.sayHello();B b = (B) ctx.getBean(b);b.sayHi();嘿, 這里的運行結(jié)果不帖了, 大家腦子里閃過即可。 圣誕到了, 小A小B 介紹完自己之后,也應(yīng)該說句 Merry Christmas Spring 說, 既然你們交給我, 這等 routine 就不用再麻煩了, 直接一并處理掉。 于是: Java代碼 1. packagecom.longthsoft.learn.spring;

18、2. 3. importorg.aspectj.lang.annotation.AfterReturning; 4. importorg.aspectj.lang.annotation.Aspect; 5. importorg.aspectj.lang.annotation.Pointcut; 6. 7. Aspect8. publicclassSimpleAspect 9. 10. Pointcut(execution(*com.longthsoft.learn.spring.models.*.say*() 11. publicvoidsimplePointcut() 12. 13. AfterReturning(pointcut=simplePointcut() 14.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論