热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring框架学习:基于Schema的异常通知与环绕通知深入解析

在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。

一 schema-based异常通知

第一步:创建通知类 :新建一个类实现 throwsAdvice 接口,throwsAdvice接口只是标记接口里面并没有任何方法,必须自己写方法,且必须叫 afterThrowing,afterThrowing方法里面的参数,有两种参数方式, 必须是 1 个或 4 个

注意:参数的异常类型要,切点报的异常类型一致,  已经jar包要和jdk版本兼容(出问题解决了好长事件),因为有时候切点抛出的异常会有多种类型,为了正确接受,建议在异常通知类里面,afterThrowing的参数写成Exception,这样可以保证兼容

package com.airplan.pojo;

import org.springframework.aop.ThrowsAdvice;

public class ExceptionAdvice implements ThrowsAdvice{
    public void afterThrowing(Exception ex) throws Throwable {
        System.out.println(ex.getMessage());
        System.out.println("异常通知执行");
    
    }
}

第二种写法:

package com.airplan.pojo;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class ExceptionAdvice implements ThrowsAdvice{
    
    public void afterThrowing(Method m, Object[] args,Object target, Exception ex) {
             System.out.println("执行异常通知");
            
    }
}

 第二步配置切入点,切面,通知所在的类

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <bean id="afterAdv" class="com.airplan.pojo.MyAfterAdvice">bean>
    
    <bean id="exceptionAdvice" class="com.airplan.pojo.ExceptionAdvice">
    
    bean>
    
    
    <aop:config>
        
        <aop:pointcut expression="execution(* com.airplan.pojo.PointCutClass.testFun(..))" id="test"/>
        <aop:advisor advice-ref="exceptionAdvice" pointcut-ref="test"/>
    aop:config>
    
    
    <bean id="pointCutClass" class="com.airplan.pojo.PointCutClass">bean>
    
beans>

测试代码;

package com.airplan.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.airplan.pojo.PointCutClass;

public class AopDemo {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        PointCutClass pointCutClass = ac.getBean("pointCutClass",PointCutClass.class);
        pointCutClass.testFun();
        //pointCutClass.throwPointCut();
    }
}

二 schema-based 环绕通知

第一步:创建环绕通知类

package com.airplan.pojo;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class AroundAdv implements MethodInterceptor{

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.println("环绕-前置");
        Object result = arg0.proceed();//放行,调用切点方法
        System.out.println("环绕-后置");
        return result;
        
    }

}

第二步配置  

<bean id="aroundAdv" class="com.airplan.pojo.AroundAdv">bean>
    
    <aop:config>
        
        <aop:pointcut expression="execution(* com.airplan.pojo.PointCutClass.throwPointCut(..))" id="test"/>
        <aop:advisor advice-ref="aroundAdv" pointcut-ref="test"/>
    aop:config>
    
    
    <bean id="pointCutClass" class="com.airplan.pojo.PointCutClass">bean>

第三步测试

package com.airplan.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.airplan.pojo.PointCutClass;

public class AopDemo {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        PointCutClass pointCutClass = ac.getBean("pointCutClass",PointCutClass.class);
        pointCutClass.throwPointCut();
        //pointCutClass.throwPointCut();
    }
}

spring学习 十 schema-based 异常通知,和环绕通知


推荐阅读
author-avatar
徐州九七医院沁尿外科1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有