<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),環繞通知(Around Advice)]
    配置方式分@AspectJ,XML,網上比較多的是Spring1.1或xml+@AspectJ方式配置,例子使用XML方式配置

    1.定義切面類接口,切面類實現這個接口。聲明(如果被代理的目標對象實現了至少一個接口,則會使用JDK動態代理。所有該目標類型實現的接口都將被代理。若該目標對象沒有實現任何接口,則創建一個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.定義環繞通知攔截處理類(環繞通知在一個方法執行之前和之后執行。 它使得通知有機會既在一個方法執行之前又在執行之后運行。并且,它可以決定這個方法在什么時候執行,如何執行,甚至是否執行。 環繞通知經常在在某線程安全的環境下,你需要在一個方法執行之前和之后共享某種狀態的時候使用。 請盡量使用最簡單的滿足你需求的通知。(比如如果前置通知(before advice)也可以適用的情況下不要使用環繞通知))
    通知方法的第一個參數的類型必須是 ProceedingJoinPoint 類型。在通知的主體中,調用 ProceedingJoinPointproceed() 方法來執行真正的方法。 proceed 方法也可能會被調用并且傳入一個 Object[] 對象 - 該數組將作為方法執行時候的參數。

    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.測試一下環繞通知

    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


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲youwu永久无码精品| 亚洲专区中文字幕| 一个人看的免费高清视频日本 | 亚洲精品第一国产综合亚AV| 成年人网站免费视频| 亚洲天堂福利视频| 成人奭片免费观看| 亚洲av中文无码字幕色不卡| 日本免费一二区在线电影| 怡红院亚洲红怡院在线观看| 免费不卡中文字幕在线| eeuss影院免费直达入口| 中文字幕日韩亚洲| 外国成人网在线观看免费视频| 亚洲好看的理论片电影| 亚洲高清免费在线观看| 亚洲性色AV日韩在线观看| 国产成人免费福利网站| 国产高潮流白浆喷水免费A片 | 久久亚洲精品无码| 日本精品人妻无码免费大全| 美女裸免费观看网站| 国产亚洲美女精品久久久久狼| 最近2018中文字幕免费视频| 亚洲综合小说另类图片动图| 亚洲国产综合精品一区在线播放| 99麻豆久久久国产精品免费| 亚洲欧洲尹人香蕉综合| 国产在线不卡免费播放| 最近免费中文字幕MV在线视频3| 亚洲女人初试黑人巨高清| 国产免费看插插插视频| 男的把j放进女人下面视频免费| 国产成人精品日本亚洲11| 亚洲精品无码久久毛片| 最近免费中文字幕mv电影| 亚洲av成人一区二区三区在线播放| 国产亚洲精品无码专区| 欧洲乱码伦视频免费| ssswww日本免费网站片| 77777午夜亚洲|