Spring-AOP-通知-异常通知

素颜马尾好姑娘i 2022-06-18 11:41 420阅读 0赞

AOP-通知-异常通知

顾名思义,目标方法发生异常植入的切面 异常通知类需要实现ThrowsAdvice接口,你会发现ThrowsAdvice没有需要实现的方法 在源码中有猫腻

  1. * <pre class="code">public void afterThrowing(Exception ex)</pre>
  2. * <pre class="code">public void afterThrowing(RemoteException)</pre>
  3. * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, Exception ex)</pre>
  4. * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)</pre>
  5. *

这当中有四个方法可以实现,下面我实现第一个
接口

  1. package com.hk.spring.aop04;
  2. public interface SomeService {
  3. public void doFirst();
  4. public void doSecond();
  5. }

接口实现

  1. package com.hk.spring.aop04;
  2. public class SomeServiceImpl implements SomeService {
  3. @Override
  4. public void doFirst() {
  5. System.out.println("主业务doFirst");
  6. //搞个异常出来
  7. int a = 4;
  8. int b = 0;
  9. a = a / b;
  10. }
  11. @Override
  12. public void doSecond() {
  13. System.out.println("主业务doSecond");
  14. }
  15. }

异常通知

  1. package com.hk.spring.aop04;
  2. import org.springframework.aop.ThrowsAdvice;
  3. /** * 异常通知 * @author 浪丶荡 * */
  4. public class MyThrowsAdvice implements ThrowsAdvice {
  5. //在目标方法发异常时执行
  6. public void afterThrowing(Exception ex){
  7. System.out.println("执行异常通知方法:发生的异常是——"+ex.getMessage());
  8. }
  9. }

配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
  3. <beans>
  4. <bean name = "someService" class="com.hk.spring.aop04.SomeServiceImpl"></bean>
  5. <!-- 注册通知 -->
  6. <bean name = "myThrowsAdvice" class="com.hk.spring.aop04.MyThrowsAdvice"></bean>
  7. <!-- 生成代理对象 -->
  8. <bean name = "serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  9. <!-- 配置代理对象的目标对象属性 (类加载器)-->
  10. <property name="target" ref="someService"/>
  11. <!-- 或者这样配置 <property name="targetName" value="someService"/> -->
  12. <!-- 配置切面 (方法)-->
  13. <property name="interceptorNames" value="myThrowsAdvice"/>
  14. <!-- 接口通过private boolean autodetectInterfaces = true可以被找到 -->
  15. </bean>
  16. </beans>

测试

  1. package com.hk.spring.aop04;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class Mytest {
  6. @Test
  7. public void test1(){
  8. String resoure = "com/hk/spring/aop04/applicationContext.xml";
  9. ApplicationContext ac = new ClassPathXmlApplicationContext(resoure);
  10. SomeService someService = (SomeService) ac.getBean("serviceProxy");
  11. someService.doFirst();
  12. someService.doSecond();
  13. }
  14. }

结果

  1. 主业务doFirst
  2. 执行异常通知方法:发生的异常是——/ by zero

发表评论

表情:
评论列表 (有 0 条评论,420人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringAop注解版1 - 四种通知

    什么是Aop aop被称为面向切面编程,使用动态代理的方式在执行前后或出现异常后做相关逻辑. aop 是oop的一种延续通过预编译方式和运行时期动态代理实现程序功能的一种技

    相关 SpringAOP通知

    spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上。是spring组件中的某个方法、无返回类型、参数类型与通知类型有关。 一个切