随笔 - 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 冬天出走的猪 阅读(394) 评论(1)  编辑  收藏 所属分类: spring

FeedBack:
# re: 用spring的AOP实现异常拦截 (转) 2009-12-25 17:24 wonkzhang
真是无巧不成双,,楼主引用的代码,,是我同事写的.原来07年她在广州...哈哈哈.现在在北京了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: