隨筆 - 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 閱讀(1689) 評論(0)  編輯  收藏 所屬分類: Spring


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


          網站導航:
           
          主站蜘蛛池模板: 石狮市| 教育| 宁城县| 沁阳市| 治县。| 双城市| 高台县| 蚌埠市| 滨州市| 龙州县| 武威市| 新密市| 重庆市| 海南省| 屯昌县| 都安| 错那县| 浦北县| 丰都县| 郎溪县| 南宫市| 呈贡县| 长寿区| 鹿邑县| 沙田区| 应城市| 承德县| 沐川县| 正蓝旗| 登封市| 广汉市| 革吉县| 栾城县| 长泰县| 九寨沟县| 科技| 东辽县| 临猗县| 泰顺县| 柳河县| 长兴县|