隨筆 - 8, 文章 - 0, 評(píng)論 - 4, 引用 - 0
          數(shù)據(jù)加載中……

          Spring事物攔截器學(xué)習(xí)筆記

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

          1.定義切面類(lèi)接口,切面類(lèi)實(shí)現(xiàn)這個(gè)接口。聲明(如果被代理的目標(biāo)對(duì)象實(shí)現(xiàn)了至少一個(gè)接口,則會(huì)使用JDK動(dòng)態(tài)代理。所有該目標(biāo)類(lèi)型實(shí)現(xiàn)的接口都將被代理。若該目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,則創(chuàng)建一個(gè)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() 
          + "關(guān)閉電視機(jī)!");
           }

           
           
          public void doPlay() {
            System.out.println(
          "打開(kāi)電視機(jī)!");
           }

           
          }


           

          2.定義前置通知攔截處理類(lèi)

           

          public class TestMethodBeforeAdvice  {
           
           
          public void before(JoinPoint jpt) {  //參數(shù)JoinPoint為默認(rèn)參數(shù)
            System.out.println(
          "正在打開(kāi)電視..");
           }

           
          }



          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>
            
          <!-- 定義切入點(diǎn) -->
            
          <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.測(cè)試一下前置通知

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


          結(jié)果:
                      正在打開(kāi)電視機(jī)..
                      打開(kāi)電視機(jī)


          5.定義返回后通知攔截處理類(lèi)

          public class TestAfterReturnAdvice {
           
           
          public void afterReturning(Object retVal) throws Throwable {
            String returnVal 
          = 電視機(jī)已經(jīng)打開(kāi)!";
            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 為返回參數(shù)
           </aop:config>


          7.測(cè)試一下返回后通知

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


          結(jié)果:
                      正在打開(kāi)電視機(jī)..
                      打開(kāi)電視機(jī)
                      電視機(jī)已經(jīng)打開(kāi)
          !


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

          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.測(cè)試一下環(huán)繞通知

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


          結(jié)果:
                      begining
                      打開(kāi)電視機(jī)
                      ending..

          posted on 2009-02-10 23:07 Pitey 閱讀(1689) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 无为县| 仁怀市| 色达县| 读书| 武乡县| 蓝田县| 徐汇区| 萝北县| 土默特右旗| 平定县| 龙川县| 柘城县| 元谋县| 喀喇| 汾西县| 平定县| 城步| 双流县| 贡嘎县| 南宁市| 峡江县| 方正县| 辽宁省| 长宁县| 绍兴市| 迁安市| 华宁县| 栖霞市| 化隆| 吉安县| 贡嘎县| 肇州县| 屯昌县| 新民市| 罗定市| 金川县| 长海县| 高碑店市| 青神县| 龙州县| 乡城县|