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

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Spring支持四種攔截類型:目標方法調用前(before),目標方法調用后(after),目標方法調用前后(around),以及目標方法拋出異常(throw)。
                   最近用到spring的AOP來實現異常攔截,用到了spring的ThrowsAdvice。ThrowsAdvice是一個標示接口,我們可以在類中定義一個或多個,來捕獲定義異常通知的bean拋出的異常,并在拋出異常前執行相應的方法。
                  我想大家可能都在項目中有過這樣的需求,想在某種異常拋出時進行一些記錄操作,例如記錄錯誤日志到數據庫或日志文件中,但把這些代碼分布到項目各處不但難于管理,并且代碼量巨大,用Spring的AOP來實現攔截不失為一個比較好的方法。
                  下面,讓我們來感受一下它的魅力吧。
           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!");
              }


              
          /**
               * 將字符串轉換為整數.
               * 
          @param number 需轉換的字符串
               * 
          @return 轉換成的字符串
               * 
          @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 {
                  
          //當number為空或非數字時,將拋出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類后,結果如下:
               ************************************
               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實現異常攔截 (轉) 2009-12-25 17:24 wonkzhang
          真是無巧不成雙,,樓主引用的代碼,,是我同事寫的.原來07年她在廣州...哈哈哈.現在在北京了  回復  更多評論
            
          主站蜘蛛池模板: 武乡县| 阿拉善盟| 北海市| 青龙| 天峻县| 孟津县| 肃南| 得荣县| 永靖县| 汾阳市| 吉首市| 文山县| 德阳市| 玉龙| 平山县| 长武县| 天峻县| 茶陵县| 文登市| 慈溪市| 论坛| 清涧县| 金湖县| 武乡县| 炎陵县| 张家港市| 苍南县| 嘉峪关市| 泰和县| 应用必备| 太康县| 全椒县| 临沧市| 巴里| 沈丘县| 仁寿县| 囊谦县| 河北区| 佛教| 伊吾县| 富川|