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

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

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

    隨筆 - 8, 文章 - 0, 評論 - 4, 引用 - 0
    數據加載中……

    Spring事物攔截器學習筆記

    Spring事物攔截器,按照通知方式分為[前置通知(Before advice),返回后通知(After returning advice)
    ,拋出后通知(After throwing advice),后通知(After (finally) advice),環(huán)繞通知(Around Advice)]
    配置方式分@AspectJ,XML,網上比較多的是Spring1.1或xml+@AspectJ方式配置,例子使用XML方式配置

    1.定義切面類接口,切面類實現這個接口。聲明(如果被代理的目標對象實現了至少一個接口,則會使用JDK動態(tài)代理。所有該目標類型實現的接口都將被代理。若該目標對象沒有實現任何接口,則創(chuàng)建一個CGLIB代理)

    public interface ITestAdvice {
     
     
    public void doPlay();
     
     
    public void doStop(Object reval);

    }



    public class Tv implements ITestAdvice{
     
     
     
    public void doStop(Object reval) {
      System.out.println(reval.toString() 
    + "關閉電視機!");
     }

     
     
    public void doPlay() {
      System.out.println(
    "打開電視機!");
     }

     
    }


     

    2.定義前置通知攔截處理類

     

    public class TestMethodBeforeAdvice  {
     
     
    public void before(JoinPoint jpt) {  //參數JoinPoint為默認參數
      System.out.println(
    "正在打開電視..");
     }

     
    }



    3.定義攔截器配置文件

    <bean id="tv" class="com.pitey.demo.Tv" />
    <bean id="beforeAdvice" class="com.pitey.demo.TestMethodBeforeAdvice" />
     
     
    <aop:aspectj-autoproxy proxy-target-class="true"/>
     
    <aop:config>
      
    <!-- 定義切入點 -->
      
    <aop:pointcut id="methodAdvice" expression="execution(* com.pitey.demo.*.*(..))" />
      
    <!-- 定義切面 -->
      
    <aop:aspect id="beforeAdviceAspect" ref="beforeAdvice">
       
    <!-- 定義前置通知 -->   
       
    <aop:before method="before" pointcut-ref="methodAdvice"/>    
     
    </aop:config>


    4.測試一下前置通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結果:
                正在打開電視機..
                打開電視機


    5.定義返回后通知攔截處理類

    public class TestAfterReturnAdvice {
     
     
    public void afterReturning(Object retVal) throws Throwable {
      String returnVal 
    = 電視機已經打開!";
      System.out.println(returnVal);
      retVal
    = (Object)returnVal;
     }

     
    }



    6.定義攔截器配置文件

     

    <bean id="afterReturnAdvice" class="com.pitey.demo.TestAfterReturnAdvice"/>
     
    <aop:config>
      
    <!-- 定義切面 -->
      
    <aop:aspect id="afterReturnAdviceAspect" ref="afterReturnAdvice">
       
    <!-- 定義后置返回通知  -->   
       
    <aop:after-returning method="afterReturning" pointcut-ref="methodAdvice" returning="retVal"/> //returing 為返回參數
     </aop:config>


    7.測試一下返回后通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結果:
                正在打開電視機..
                打開電視機
                電視機已經打開
    !


    8.定義環(huán)繞通知攔截處理類(環(huán)繞通知在一個方法執(zhí)行之前和之后執(zhí)行。 它使得通知有機會既在一個方法執(zhí)行之前又在執(zhí)行之后運行。并且,它可以決定這個方法在什么時候執(zhí)行,如何執(zhí)行,甚至是否執(zhí)行。 環(huán)繞通知經常在在某線程安全的環(huán)境下,你需要在一個方法執(zhí)行之前和之后共享某種狀態(tài)的時候使用。 請盡量使用最簡單的滿足你需求的通知。(比如如果前置通知(before advice)也可以適用的情況下不要使用環(huán)繞通知))
    通知方法的第一個參數的類型必須是 ProceedingJoinPoint 類型。在通知的主體中,調用 ProceedingJoinPointproceed() 方法來執(zhí)行真正的方法。 proceed 方法也可能會被調用并且傳入一個 Object[] 對象 - 該數組將作為方法執(zhí)行時候的參數。

    public class TestMethodIntercepor{
     
     
    public Object doBasicProfiling(ProceedingJoinPoint  pjp) throws Throwable {
      System.out.println(
    "begining");
      Object obj 
    = pjp.proceed();
      
      System.out.println(
    "ending..");
      
    return obj;
     }
     
    }




    9.定義攔截器配置文件

     

    <bean id="aroundAdvice" class="com.pitey.demo.TestMethodIntercepor"/>
     
    <aop:config>
      
    <!-- 定義切面 -->
      
    <aop:aspect id="aroundAspect" ref="aroundAdvice">
     
    <aop:around method="doBasicProfiling" pointcut-ref="methodBeforeAdvice"/>
      
    </aop:aspect>
     
    </aop:config>



    10.測試一下環(huán)繞通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結果:
                begining
                打開電視機
                ending..

    posted on 2009-02-10 23:07 Pitey 閱讀(1684) 評論(0)  編輯  收藏 所屬分類: Spring


    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品一二三区| 亚洲精品午夜无码电影网| 亚洲Av无码专区国产乱码DVD | 四虎在线播放免费永久视频| 一级毛片高清免费播放| 亚洲综合视频在线| 国产成人精品免费视频软件| 亚洲av成人一区二区三区| www国产亚洲精品久久久| 日韩精品无码免费一区二区三区 | 黄色网页在线免费观看| 亚洲国产成人久久精品app| 亚洲福利中文字幕在线网址| 最近最新高清免费中文字幕| WWW国产亚洲精品久久麻豆| 婷婷久久久亚洲欧洲日产国码AV| 日本a级片免费看| 免费A级毛片无码A∨中文字幕下载| 亚洲AV无码一区二区三区网址| 久久国产精品亚洲综合| 国产免费观看黄AV片| 美女视频黄的全免费视频| 久青草视频97国内免费影视| 在线观看日本亚洲一区| 亚洲AV电影院在线观看| 亚洲国产人成精品| 成人无遮挡毛片免费看| 亚洲1区2区3区精华液| 亚洲综合激情视频| 亚洲人成精品久久久久| 一区二区三区亚洲视频| 国内外成人免费视频| 1024免费福利永久观看网站| 亚洲校园春色另类激情| 久久精品国产亚洲AV麻豆王友容| 国产在线不卡免费播放| 免费看韩国黄a片在线观看| 免费人成大片在线观看播放| 国产精品亚洲四区在线观看| 亚洲综合精品香蕉久久网97| 久久精品国产亚洲网站|