<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    胖熊熊

    得到多少又失去了什么

    spring 學習(1.2) 入門基礎- AOP

    aop 的學習,轉自javaeye
    一、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也是這樣一個東西,但是Spring中為什么叫Advisor而不叫做Aspect。

    Weaving:將Aspect加入到程序代碼的過程,對于Spring AOP,由ProxyFactory或者ProxyFactoryBean負責織入動作。

    Target:這個很容易理解,就是需要Aspect功能的對象。

    Introduction:引入,就是向對象中加入新的屬性或方法,一般是一個實例一個引用對象。當然如果不引入屬性或者引入的屬性做了線程安全性處理或者只讀屬性,則一個Class一個引用也是可以的(自己理解)。Per-class lifecycle or per-instance life cycle

    二、AOP 種類
    1、靜態織入:指在編譯時期就織入Aspect代碼,AspectJ好像是這樣做的。

    2、動態織入:在運行時期織入,Spring AOP屬于動態織入,動態織入又分靜動兩種,靜則指織入過程只在第一次調用時執行;動則指根據代碼動態運行的中間狀態來決定如何操作,每次調用Target的時候都執行(性能較差)。

    三、Spring AOP 代理原理
    Spring AOP 是使用代理來完成的,Spring 會使用下面兩種方式的其中一種來創建代理:
    1、JDK動態代理,特點只能代理接口,性能相對較差,需要設定一組代理接口。
    2、CGLIB 代理,可代理接口和類(final method除外),性能較高(生成字節碼)。

    四、Spring AOP 通知類型
    1、BeforeAdvice:前置通知需實現MethodBeforeAdvice,但是該接口的Parent是BeforeAdvice,致于什么用處我想可能是擴展性需求的設計吧。或者Spring未來也并不局限于Method的JoinPoint(胡亂猜測)。BeforeAdvice可以修改目標的參數,也可以通過拋出異常來阻止目標運行。

    2、AfterreturningAdvice:實現AfterreturningAdvice,我們無法修改方法的返回值,但是可以通過拋出異常阻止方法運行。

    3、AroundAdvice:Spring 通過實現MethodInterceptor(aopalliance)來實現包圍通知,最大特點是可以修改返回值,當然它在方法前后都加入了自己的邏輯代碼,因此功能異常強大。通過MethodInvocation.proceed()來調用目標方法(甚至可以不調用)。

    4、ThrowsAdvice:通過實現若干afterThrowing()來實現。

    5、IntroductionInterceptor:Spring 的默認實現為DelegatingIntroductionInterceptor

    五、Spring AOP Pointcut
    以上只是Advice,如果不指定切入點,Spring 則使用所有可能的Jointpoint進行織入(當然如果你在Advice中進行方法檢查除外)。因此切入點在AOP中扮演一個十分重要的角色。Spring 2.0 推薦使用AspectJ的Annocation的切入點表達式來定義切入點,或者使用<aop:xxx/>來定義AOP,這方面本篇不做考慮。

    1、Pointcut:它是Spring AOP Pointcut的核心,定義了getClassFilter()和getMethodMatcher()兩個方法。

    2、ClassFilter:定義了matches(Class cls)一個方法。

    3、MethodMatcher() 定義了matches(Method,Class),isRuntime(),matches(Mathod,Class,Object[])三個方法,如果isRuntime()返回true則表示為動態代理(實際是動態代理的動態代理),則調用第三個方法(每訪問一次調用一次),否則調用第一個方法(并且只調用一次)

    4、Spring AOP 靜態切入點的幾個實現。
    ComposablePointcut 太復雜一個切入點無法表達就用這個,union MethodMatcher和ClassFilter或者intersection MethodMatcher、ClassFilter和Pointcut。為什么不實現union Pointcut? 而只能通過Pointcuts類對Pointcut進行union操作。

    ControlFlowPointcut 想對程序的運行過程進行追蹤就用這個

    DynamicMatchMatcherPointcut 想用動態AOP 就用這個

    JdkRegexpMethodPointcut 想使用正則表達式就用這個

    Perl5RegexpMethodPointcut

    NameMatchMethodPointcut 想用方法名字來匹配就用這個

    StaticMethodMatcherPointcut 靜態切入點就用這個
    沒有人反對你直接實現Pointcut:)。

    六、Spring AOP 中的Advisor其實就是Aspect
    1、 PointcutAdvisor
    其實一般使用DefaultPointcutAdvisor就足夠了,給它Advice和Pointcut。
    當然如果想少寫那么幾行代碼也可以使用NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor等。
    更多Advisor可以查看API文檔。

    2、 IntroductionAdvisor
    默認實現為DefaultIntroductionAdvisor。

    七、AOP ProxyFactory
    使用代碼實現AOP 可使用ProxyFactory
    聲明式AOP 可使用ProxyFactoryBean
    ProxyFactoryBean 需要設定 target,interceptorNames(可以是Advice或者Advisor,注意順序)
    對接口代理需設置proxyInterfaces

    八、自動代理
    BeanNameAutoProxyCreator

    代碼
    1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
    2.     <property name="beanNames"><value>jdk*,onlyJdk</value></property>  
    3.     <property name="interceptorNames">  
    4.         <list>  
    5.             <value>myInterceptor</value>  
    6.         </list>  
    7.     </property>  
    8. </bean>  

    DefaultAdvisorAutoProxyCreator
    代碼
    1. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
    2. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
    3.     <property name="transactionInterceptor" ref="transactionInterceptor"/>  
    4. </bean>  
    5. <bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>  
    6. <bean id="businessObject1" class="com.mycompany.BusinessObject1">  
    7.     <!-- Properties omitted -->  
    8. </bean>  
    9. <bean id="businessObject2" class="com.mycompany.BusinessObject2"/>  

     

    九、Spring 2.0 AOP 略
    以上為本人這段時間來看Spring AOP的一些學習體會,有什么說的不對的地方請批評指正。

    posted on 2007-05-17 10:34 fatbear 閱讀(741) 評論(1)  編輯  收藏 所屬分類: spring

    評論

    # re: spring 學習(1.2) 入門基礎- AOP 2008-04-24 20:02 Jessy

    我總覺得AOP部分好難理解的,看了兩三遍了,還是搞不清楚,郁悶...不過,這篇文章寫得很到位,只是我還不能很理解了...嘿嘿  回復  更多評論   

    主站蜘蛛池模板: 新最免费影视大全在线播放| 亚洲精品无码日韩国产不卡av| 国产精品美女久久久免费| 国产性生交xxxxx免费| 亚洲国产精品成人综合色在线| 中文字幕av无码无卡免费| 亚洲精品在线不卡| 亚洲免费福利在线视频| 亚洲乱码日产精品一二三| 国产真实伦在线视频免费观看| 国产亚洲精品仙踪林在线播放| 国产乱人免费视频| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 国产乱辈通伦影片在线播放亚洲| 国产亚洲男人的天堂在线观看| 亚洲午夜成人精品电影在线观看| 国产精品免费久久| 亚洲一区精品中文字幕| 日韩免费一区二区三区在线| 亚洲精品欧美综合四区| 亚洲男人的天堂一区二区| 在线观看免费播放av片| 亚洲1区1区3区4区产品乱码芒果| 免费看片A级毛片免费看| 免费看又黄又爽又猛的视频软件| 国产亚洲婷婷香蕉久久精品| 18禁止看的免费污网站| 亚洲精品伦理熟女国产一区二区| 亚洲精品97久久中文字幕无码| 久久er国产精品免费观看2| 亚洲国产日韩在线成人蜜芽 | 精品久久久久久久久免费影院| 亚洲AV无码专区在线观看成人| 免费久久精品国产片香蕉| a级毛片免费全部播放无码| 91在线亚洲精品专区| 日本一区二区三区日本免费| 三年片在线观看免费西瓜视频| 久久精品国产亚洲av麻豆图片 | 无码区日韩特区永久免费系列| 国产大陆亚洲精品国产|