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

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

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

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    spring aop

    Posted on 2010-09-07 22:03 瘋狂 閱讀(2117) 評論(0)  編輯  收藏 所屬分類: java spring

    AOP的術語

    z

    切面(aspect)

            切面是你要實現的交叉功能。就是通知和切入點的結合。通知和切入點共同定義了關于切面的全部內容:它的功能、在何時和何地完成功能。

    通知(Advice)

          通知定義了切面是什么以及何時使用。除了描述切面要完成的工作,通知還解決了何時執行這個工作的問題。應該在一個方法被調用之前?之后?或者拋出異常時。

    切入點(pointcut)
            如果說通知定義了切面的"什么"和"何時",那么切入點就定義了"何地"。


    連接點(joinpoint)

          連接點是應用程序執行過程中能夠插入切面的地點。這些點可以是方法被調用時、異常拋出時、甚至字段被編輯時。

    引入(Intrduction)

            引入允許你為已經存在的類添加新方法和屬性。比如一個Auditable通知類,記錄對象在最后一次被修改時的狀態。只需要一個setLastModified(Date)方法,和一個實例變量來保存這個狀態。這個新方法和實例變量就可以被引入到現有的類,從而在不修改它們的情況下,讓他們具有新的行為和狀態。

    目標對象(Target)

            目標對象是被通知的對象。

    代理(Proxy)

             代理是將通知應用到目標對后創建的對象。

    織入(weaving)

              織入是將切面應用到目標對象從而創建一個新的代理對象的過程。 在目標對象的生命周期里有多個機會發生織入過程。比如編譯時、類加載時、運行時。


     

    通知、切點、通知者

    通知

    在Spring AOP里有5中類型的通知,分別由一個接口進行定義

    Before(前)

    org.springframework.aop.MethodBeforeAdvice

    After-returning(返回后)

    org.springframework.aop.AfterReturningAdvice

    After-throwing(拋出后)

    org.springframework.aop.ThrowsAdvice

    Around(周圍)

    org.aopalliance.intercept.MethodInterceptor

    Introduction(引入)

    org.springframework.aop.IntroductionInterceptor


    <bean id="audienceAdvice" class="com.springidol.AudienceAdvice"></bean>

    //AudienceAdvice類實現了3中不同的3中不同類型的AOP通知。

    Public class AudienceAdvice implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{

    //前通知要求實現的方法

    public void before(Method method,Object[] args,Object target) throws Throwable{


    }


    //返回后通知要求實現的方法,Object returnValue表示被調用方法的返回值

    public void  afterReturning(Object returnValue,Method method,Object[] args,Object target) throws Throwable{


    }


    //拋出后通知不需要實現任何方法,它只是一個標記接口,告訴spring相應的通知要求處理被拋出的異常,除最后一個參數外,其他參數都是可選的

    public void afterThrowing(Method method,Object[] args,Object target,NullPointerException e) throws Throwable{


    //當發生NullPointerException 時,記錄日志

    LOGGER.error("NPE thrown from "+method.getName());

    }


    }


    其中的Method method參數,表示要使用這個通知的方法,第二個參數Object[] args是方法被調用時要傳遞的參數。最后一個是方法調用的目標也就是被調用方法所在的對象。

    //周圍通知相當于前通知、后通知、拋出后通知的結合。

    Public class AudienceAdvice implements MethodInterceptor{

    Public Object invoke(MethodInvocation invocation) throws Throwable{

    try{

    ..............................    //在方法調用之前

    Object returnValue=invocation.proceed();    調用目標方法

    .............................    //在方法調用之后

    }catch(PerformanceException e){

    .............................    /在出現異常之后

    }

    }

    }


    切點

    1.正則切點


    切點的作用主要在于選擇需要使用通知的方法,比如下面的正則表達式切點:

    <bean id="performancePointcut"                      class="org.springframework.aop.support.JbkRegexpMethodPointcut">

    <property name="pattern" value=".*perform" />

    </bean>


    Pattern屬性用于制定方法匹配所使用的切點模板,本例中被設置為一個正則表達式,它應該匹配任何類里名為perform的方法。


    定義切點后,把切點與通知關聯


    <bean id="audienceAdvisor"                     class="org.springframework.aop.support.DefaultPointcutAdvisor">

    <property name="advice" value="audienceAdvice" />

    <property name="pointcut" value="performancePointcut" />

    </bean>


    DefaultPointcutAdvisor是一個通知者類,它只是把通知關聯到一個切點


    也可以使用RegexpMethodPointcutAdvisor是一個特殊的通知者類,可以在一個Bean里面定義切點和通知者

    <bean id="audienceAdvisor"                     class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

    <property name="advice" value="audienceAdvice" />

    <property name="pattern" value=".*perform" />

    </bean>


    2.定義AspectJ切點


    正則表達式雖然可以作為切點定義語言來使用,但是它并不是針對切點而創建的,其主要用途還是文本解析。AspectJ里定義切點的方法就可以看出AspectJ的切點語言是一種真正的切點表達式語言。


    <bean id="performancePointcut"                     class="org.springframework.aop.aspectj.AspectJExpressionPointcut">

    <property name="expression" value="execution(* Performer+.perform(..))" />

    </bean>


    可以使用DefaultPointcutAdvisor把它和通知關聯起來,就像前面一樣。同樣,也可以設置一個特殊的通知者

    <bean id="audienceAdvisor"                     class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">

    <property name="advice" value="audienceAdvice" />

    <property name="expression" value="execution(* *.perform(..))" />

    </bean>

    execution* *.perform(..)) 

    execution表示執行方法時,* *表示任意返回類型,.perform表示perform方法,(..)表示任意參數設置


    使用ProxyFactoryBean


    <bean id="duke"

              class="org.springframework.aop.framework.ProxyFactoryBean">

    <property name="proxyInterfaces">

                <value>genericdaotest.dao.PersonDao</value>

            </property>

            <property name="target">

                <bean parent="abstractDaoTarget">

                    <constructor-arg>

                        <value>genericdaotest.domain.Person</value>

                    </constructor-arg>

                </bean>

            </property>

             <property name="interceptorNames">

                 <list>

                     <value>audienceAdvisor</value>

                 </list>

             </property>

      </bean>


    Spring里面的ProxyFactoryBean是個工廠Bean,用于生成一個代理,把一個或者多個攔截者(和通知者)應用到Bean,有target、interceptorNames、proxyInterfaces三個屬性,后兩個都是數組屬性target表示要代理的對象

    interceptorNames屬性告訴ProxyFactoryBean哪個通知者要應用于被代理的

    beanproxyInterfaces告訴ProxyFactoryBean代理應該實現哪個接口。本例中代理的是genericdaotest.dao.PersonDao接口

    target告訴ProxyFactoryBean,哪個Bean是代理。



    ----------------以上轉載自:http://bhsc.happy.blog.163.com/blog/static/1043895522008111144158773/


    主站蜘蛛池模板: 亚洲欧洲尹人香蕉综合| 亚洲免费观看视频| 亚洲第一成年网站视频| 成人免费午夜视频| 亚洲中文字幕无码久久| 香蕉高清免费永久在线视频| 亚洲精品GV天堂无码男同| 日韩视频在线免费观看| 精品韩国亚洲av无码不卡区| 免费久久精品国产片香蕉| a级毛片免费网站| 亚洲成在人线av| 日韩插啊免费视频在线观看| 亚洲a一级免费视频| 91福利免费体验区观看区| 亚洲性线免费观看视频成熟| 午夜免费福利影院| 日本黄页网址在线看免费不卡| 亚洲人成色7777在线观看不卡 | 久久99久久成人免费播放| 亚洲精品无码成人片久久| 免费观看国产网址你懂的| 亚洲成a∧人片在线观看无码| 国产成人精品曰本亚洲79ren| 无码日韩精品一区二区免费暖暖| 亚洲免费网站在线观看| 四只虎免费永久观看| 青柠影视在线观看免费高清| 亚洲性一级理论片在线观看| 波多野结衣久久高清免费| CAOPORN国产精品免费视频| 亚洲国产午夜电影在线入口| 又黄又爽一线毛片免费观看| 野花香在线视频免费观看大全| 337p欧洲亚洲大胆艺术| 日本不卡高清中文字幕免费| 国产啪精品视频网站免费尤物 | 免费一级毛片在线播放视频免费观看永久| 亚洲乱码国产一区网址| 120秒男女动态视频免费| 直接进入免费看黄的网站|