戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注
AOP-XML-advisor方式-异常通知
spring应用手册(第四部分)
在Advisor中也有异常通知,异常通知需要实现接口:org.springframework.aop.ThrowsAdvice
我们观察org.springframework.aop.ThrowsAdvice的源代码:
package org.springframework.aop;
public interface ThrowsAdvice extends org.springframework.aop.AfterAdvice {
}
我们会发现ThrowsAdvice也是AfterAdvice的子接口,并且没有任何方法。
其实ThrowsAdvice仅仅是一个标识,表示当前类是一个异常通知类,为什么没有方法,这是为了方便使用者可以多定义不同的异常处理方法。方法名称必须是afterThrowing,但是参数我们可以自己随意定义。
我们直接看案例:
我们自己定义一个异常通知类,在其中定义两个不同的异常处理方法。
/**
* @author 戴着假发的程序员
* @company http://www.boxuewa.com
* @description
*/
public class DkThrowsAdvice implements ThrowsAdvice {
/**
* 处理空指针异常
* @param ex
*/
public void afterThrowing(NullPointerException ex){
System.out.println("空指针异常通知:"+ex.getMessage());
}
/**
* 索引越界异常处理
* 这里我们不仅指明了异常类型,而且传入其他参数,这些参数spring都会帮我穿进来
* @param m 目标方法对象
* @param args 目标方法参数
* @param target 目标对象
* @param ex
*/
public void afterThrowing(Method m, Object[] args, Object target, IndexOutOfBoundsException ex){
System.out.println("索引越界异常处理开始--");
System.out.println("目标对象:"+target);
System.out.println("参数列表:"+ Arrays.toString(args));
System.out.println("被增强方法:"+m);
System.out.println("出现异常:"+ex.getMessage());
System.out.println("索引越界异常处理结束--");
}
}
在aop:config中配置异常通知:
<!-- 配置后置通知bean-->
<bean id="throwAdvice" class="com.st.dk.demo9.advices.DkThrowAdvice"/>
<aop:config>
<!-- 声明一个切入点,命名为pointcut1 -->
<aop:pointcut id="pointcut1"
expression="execution(* com.st.beans..*.*(..))"/>
<!-- 异常通知配置-->
<aop:advisor advice-ref="throwAdvice" pointcut-ref="pointcut1"/>
</aop:config>
修改业务类,抛出空指针异常:
public String printMessage(String msg){
System.out.println("---------业务方法------");
System.out.println("MessageBean-printMessage:"+msg);
String str = null;
str.trim();
System.out.println("---------业务方法------");
return msg;
}
执行业务结果:
修改业务类方法,抛出索引越界异常:
//输出信息的业务方法
public String printMessage(String msg){
System.out.println("---------业务方法------");
System.out.println("MessageBean-printMessage:"+msg);
String str = "";
str.charAt(10);
System.out.println("---------业务方法------");
return msg;
}
执行业务方法结果: