隨筆 - 4  文章 - 10  trackbacks - 0
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Spring支持四種攔截類型:目標(biāo)方法調(diào)用前(before),目標(biāo)方法調(diào)用后(after),目標(biāo)方法調(diào)用前后(around),以及目標(biāo)方法拋出異常(throw)。
                   最近用到spring的AOP來實現(xiàn)異常攔截,用到了spring的ThrowsAdvice。ThrowsAdvice是一個標(biāo)示接口,我們可以在類中定義一個或多個,來捕獲定義異常通知的bean拋出的異常,并在拋出異常前執(zhí)行相應(yīng)的方法。
                  我想大家可能都在項目中有過這樣的需求,想在某種異常拋出時進行一些記錄操作,例如記錄錯誤日志到數(shù)據(jù)庫或日志文件中,但把這些代碼分布到項目各處不但難于管理,并且代碼量巨大,用Spring的AOP來實現(xiàn)攔截不失為一個比較好的方法。
                  下面,讓我們來感受一下它的魅力吧。
           1. 操作類TestBean
          /**
           * Copyright 2007 GuangZhou Cotel Co. Ltd.
           * All right reserved.    
           * 測試異常攔截的bean     
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 
           * Creation date: 2007-7-24 - 下午08:00:37
           
          */

          public class TestBean {
              
          public void method1() throws Exception {
                  
          throw new Exception("Exception happened!");
              }


              
          /**
               * 將字符串轉(zhuǎn)換為整數(shù).
               * 
          @param number 需轉(zhuǎn)換的字符串
               * 
          @return 轉(zhuǎn)換成的字符串
               * 
          @throws NumberFormatException
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2007-7-24 - 下午08:05:41
               
          */

              
          public int changeToNumber(String number) throws NumberFormatException {
                  
          //當(dāng)number為空或非數(shù)字時,將拋出NumberFormatException
                  int num = Integer.parseInt(number);
                  
          return num;
              }

          }



          2. 錯誤日志攔截類ExceptionAdvisor


          import org.springframework.aop.ThrowsAdvice;
          import org.springframework.aop.framework.ProxyFactory;

          import java.lang.reflect.Method;

          /**
           * Copyright 2007 GuangZhou Cotel Co. Ltd.
           * All right reserved.    
           * 異常攔截類.      
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 
           * Creation date: 2007-7-24 - 下午08:12:25
           
          */

          public class ExceptionAdvisor implements ThrowsAdvice {
              
          public static void main(String[] args) {
                  TestBean bean 
          = new TestBean();
                  ProxyFactory pf 
          = new ProxyFactory();
                  pf.setTarget(bean);
                  pf.addAdvice(
          new ExceptionAdvisor());

                  TestBean proxy 
          = (TestBean) pf.getProxy();
                  
          try {
                      proxy.method1();
                  }
           catch (Exception ignore) {
                  }

                  
                  
          try {
                      proxy.changeToNumber(
          "amigo");
                  }
           catch (Exception ignore) {
                  }

              }


              
          /**
               * 對未知異常的處理.
               * 
          @param method
               * 
          @param args
               * 
          @param target
               * 
          @param ex
               * 
          @throws Throwable
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2007-7-24 - 下午03:35:02
               
          */

              
          public void afterThrowing(Method method, Object[] args, Object target,
                      Exception ex) 
          throws Throwable {
                  System.out.println(
          "*************************************");
                  System.out.println(
          "Error happened in class: " + target.getClass().getName());
                  System.out.println(
          "Error happened in method: " + method.getName());
                  
                  
          for (int i = 0; i < args.length; i++{
                      System.out.println(
          "arg[" + i + "]: " + args[i]);
                  }

                  
                  System.out.println(
          "Exception class: " + ex.getClass().getName());
                  System.out.println(
          "*************************************");
              }

              
              
          /**
               * 對NullPointerException異常的處理
               * 
          @param method
               * 
          @param args
               * 
          @param target
               * 
          @param ex
               * 
          @throws Throwable
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2007-7-24 - 下午01:17:35
               
          */

              
          public void afterThrowing(Method method, Object[] args, Object target,
                      NullPointerException ex) 
          throws Throwable {
                  System.out.println(
          "*************************************");
                  System.out.println(
          "Error happened in class: " + target.getClass().getName());
                  System.out.println(
          "Error happened in method: " + method.getName());
                  
                  
          for (int i = 0; i < args.length; i++{
                      System.out.println(
          "args[" + i + "]: " + args[i]);
                  }

                  
                  System.out.println(
          "Exception class: " + ex.getClass().getName());
                  System.out.println(
          "*************************************");
              }

          }

               運行ExceptionAdvisor類后,結(jié)果如下:
               ************************************
               Error happened in class: TestBean
               Error happened in method: method1
               Exception class: java.lang.Exception
              *************************************
              *************************************
              Error happened in class: TestBean
              Error happened in method: changeToNumber
              arg[0]: amigo
              Exception class: java.lang.NumberFormatException
              *************************************

              在工程中,可將ExceptionAdvisor類作為bean定義,并指定要納入其進行異常攔截的類。

          posted on 2007-08-13 16:03 冬天出走的豬 閱讀(399) 評論(1)  編輯  收藏 所屬分類: spring

          FeedBack:
          # re: 用spring的AOP實現(xiàn)異常攔截 (轉(zhuǎn)) 2009-12-25 17:24 wonkzhang
          真是無巧不成雙,,樓主引用的代碼,,是我同事寫的.原來07年她在廣州...哈哈哈.現(xiàn)在在北京了  回復(fù)  更多評論
            
          主站蜘蛛池模板: 西和县| 东城区| 迁安市| 克什克腾旗| 伽师县| 泗水县| 咸阳市| 临江市| 黄浦区| 金坛市| 长岭县| 故城县| 阿克苏市| 平利县| 全州县| 奉新县| 无极县| 贵港市| 吴江市| 华阴市| 丹凤县| 阜南县| 温宿县| 安龙县| 奈曼旗| 黑水县| 襄汾县| 邹平县| 陈巴尔虎旗| 青铜峡市| 安仁县| 称多县| 东城区| 达拉特旗| 永顺县| 渝中区| 泸西县| 桑日县| 称多县| 宜宾县| 胶南市|