`
jayghost
  • 浏览: 441928 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

用spring的AOP——ThrowsAdvice实现异常拦截

    博客分类:
  • Java
 
阅读更多

转:http://www.blogjava.net/amigoxie/archive/2007/07/24/132142.html(此原文有一点小错误O(∩_∩)O~)

 

Spring支持四种拦截类型:目标方法调用前(before),目标方法调用后(after),目标方法调用前后(around),以及目标方法抛出异常(throw)。
         最近用到spring的AOP来实现异常拦截,用到了spring的ThrowsAdvice。ThrowsAdvice是一个标示接口,我们可以在类中定义一个或多个,来捕获定义异常通知的bean抛出的异常,并在抛出异常前执行相应的方法。
        我想大家可能都在项目中有过这样的需求,想在某种异常抛出时进行一些记录操作,例如记录错误日志到数据库或日志文件中,但把这些代码分布到项目各处不但难于管理,并且代码量巨大,用Spring的AOP来实现拦截不失为一个比较好的方法。
        下面,让我们来感受一下它的魅力吧。
 1. 操作类TestBean

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

	/**
	 * 将字符串转换为整数.
	 */
	public int changeToNumber(String number) throws NumberFormatException {
		// 当number为空或非数字时,将抛出NumberFormatException
		int num = Integer.parseInt(number);
		return num;
	}
}

 2. 错误日志拦截类ExceptionAdvisor

import java.lang.reflect.Method;

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

public class ExceptionAdvisor implements ThrowsAdvice {
	public void afterThrowing(RuntimeException rx) {

	}

	/**
	 * 对未知异常的处理.
	 */
	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("*************************************");
	}

	/**
	 * 对NumberFormatException异常的处理
	 */
	public void afterThrowing(Method method, Object[] args, Object target, NumberFormatException 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("*************************************");
	}

	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) {
			System.out.println("Exception in method1 catch");
		}

		try {
			proxy.changeToNumber("amigo");
		} catch (Exception ignore) {
			System.out.println("Exception in changeToNumber catch");
		}
	}
}
 运行ExceptionAdvisor类后,结果如下:

*************************************

Error happened in class: com.exception.TestBean

Error happened in method: method1

Exception class: java.lang.Exception

*************************************

Exception in method1 catch

*************************************

Error happened in class: com.exception.TestBean

Error happened in method: changeToNumber

args[0]: amigo

Exception class: java.lang.NumberFormatException

*************************************

Exception in changeToNumber catch


 

 

 

 

 

分享到:
评论
1 楼 小猪晒太阳 2012-10-23  
楼主你的配置文件怎么配的啊、 求分享啊

相关推荐

    spring aop 拦截器简单实现

    它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,可以在方法调用前后执行自定义逻辑。...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行拦截来实现。这些横切关注点通常是一些与业务逻辑不直接相关的服务...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    SpringAOP的日志拦截示例

    首先,我们需要创建一个拦截器类,这个类通常会实现Spring的`MethodBeforeAdvice`、`AfterReturningAdvice`或`ThrowsAdvice`接口,或者自定义一个Advisor。在这个案例中,文件名为`LogInterceptor.java`的类可能是...

    spring aop 实例

    通过实现`org.aopalliance.intercept.MethodInterceptor`接口,我们可以拦截并自定义任何方法的调用。`invoke`方法是核心,它接收一个`InvocationContext`对象,包含了调用的目标方法、目标对象和其他相关信息。我们...

    spring AOP 概念

    - **Spring AOP 中的 Aspect**:通常由 Advisor 实现,包含了一个 Pointcut 和一个或多个 Advice。 ##### Weaving(织入) - **定义**:将 Aspect 注入到应用程序中,从而实现 AOP 的过程。 - **Spring AOP 的织入...

    Spring 应用之AOP

    Spring提供了丰富的AOP支持,包括声明式的AOP实现,使得开发者可以通过配置文件或者注解来实现AOP。 ##### 1. 添加Spring AOP库 为了在项目中使用Spring AOP,首先需要添加相应的依赖库。例如,在MyEclipse中,可以...

    spring_教程_2_AOP

    Spring AOP(Aspect Oriented Programming)是Spring框架的核心特性之一,它允许程序员实现关注点分离,将横切关注点(如日志、事务管理、安全检查)从核心业务逻辑中解耦出来。在AOP中,横切关注点被称为切面,而...

    spring通知

    Spring提供了`org.springframework.aop.ThrowsAdvice`接口来实现异常后通知。 5. **环绕通知(Around Advice)** 环绕通知是最强大的通知类型,它在方法调用前后都能执行,并且可以控制方法是否执行以及如何执行。...

    Spring第02天1

    - Spring AOP使用Java动态代理或CGLIB字节码增强实现代理机制。 - 当目标类实现了接口时,Spring使用JDK的Proxy类生成动态代理对象。 - 对于没有接口的类,Spring使用CGLIB库生成目标类的子类,实现方法的增强。 ...

    spring学习笔记2

    6. **AOP代理**:Spring AOP使用动态代理技术来实现AOP,主要通过`ProxyFactoryBean`来创建代理对象。它可以配置`proxyInterfaces`和`interceptorNames`来指定代理接口和拦截器。 7. **Pointcut**:定义了哪些连接...

    java-aop-predicate-dispatch:java中使用AOP实现通用谓词分派机制

    - `org.springframework.aop.MethodBeforeAdvice`,`org.springframework.aop.ThrowsAdvice` 等接口:实现自定义的通知。 **谓词分派实例** 假设我们有一个业务场景,需要根据用户的角色动态决定是否允许访问某个...

    spring 要点总结

    Spring 是一个广泛使用的 Java 应用开发框架,它提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。以下将详细介绍 Spring 中的 AOP 相关知识点。 1. **AOP(面向切面编程)** - **静态代理**...

    Spring入门

    - **实现**:通过实现`Validator`接口或使用Spring提供的`DataBinder`类。 - **示例**:定义一个实现`Validator`接口的类,用于验证某个Java对象的合法性。 #### Controller组件继承架构 - **定义**:Spring MVC...

    无标题设计模式-适配器模式

    通过分析Spring AOP的适配器模式,我们可以看到Advice(通知)如MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice等都有对应的拦截器,这些拦截器实现了适配器功能,将Advice的增强方法转化为拦截器可以调用...

Global site tag (gtag.js) - Google Analytics