Spring的四种Advice源码探究
来源:互联网 发布:预算定额软件 编辑:程序博客网 时间:2024/05/24 04:14
一、MethodBeforeAdvice的执行
this.advice.before(mi.getMethod(),mi.getArguments(), mi.getThis() );//调用before方法 return mi.proceed();//执行下一个拦截器
二、AfterReturningAdvice的执行
Object retVal = mi.proceed();//先执行下一个拦截器,如果拦截器已完就执行目标方法 this.advice.afterReturning(retVal, mi.getMethod(),mi.getArguments(), mi.getThis());//最后再执行该方法
这里可以看出before和after的配置顺序和执行顺序的关系
配置的MethodBeforeAdvice会按照配置顺序执行而配置的AfterReturningAdvice则按配置的反序执行
三、Around Advice的执行
Around Advice则提供了一个更加灵活的方式给用户,想实现AfterAdvice则先执行proceed再做自己的操作,想实现Before Advice则先做操作再执行proceed,甚至可以不调用并返回任意值。该实现类的执行顺序则是在配置的顺序上再看是先执行proceed还是先执行自己的操作。
四、ThrowsAdvice的执行
try { return mi.proceed();//执行链往后走,在后续过程中抛出异常则捕获并执行相关处理 } catch (Throwable ex) { Method handlerMethod = getExceptionHandler(ex); if (handlerMethod != null) { invokeHandlerMethod(mi, ex, handlerMethod); } throw ex; }
在以下3种情况时,会首先查找当前ThrowsAdvice拥有的处理该异常或者父类异常的方法
1. 配置中ThrowsAdvice之后的Advice
2. 所有afterAdvice中preceed执行后抛出的异常
3. 目标方法执行异常
下面是执行配置的处理函数
if(method.getParameterTypes().length == 1) {//一个参数的方法 handlerArgs = new Object[] { ex }; } else {//四个参数的方法,method,args,目标对象,异常 handlerArgs = new Object[] {mi.getMethod(), mi.getArguments(),mi.getThis(), ex}; } try { method.invoke(this.throwsAdvice, handlerArgs); } catch (InvocationTargetException targetEx) { throw targetEx.getTargetException(); }
下面是获取处理函数的判断AFTER_THROWING= "afterThrowing"
if (method.getName().equals(AFTER_THROWING) && (method.getParameterTypes().length == 1 ||method.getParameterTypes().length == 4) && Throwable.class.isAssignableFrom(method.getParameterTypes()[method.getParameterTypes().length - 1]) )
这个部分代码可以看出ThrowsAdvice中的两种可用的处理方法
public void afterThrowing(Exception e)public void afterThrowing(Method m,Object[]args,Object target,Exception e)
- Spring的四种Advice源码探究
- Spring AOP 中 advice 的四种类型 before after throwing advice around
- Spring AOP 中 advice 的四种类型 before after throwing advice around
- spring AOP 中 advice 的四种类型 before after throwing advice around
- Spring的AOP(二):AOP中的术语及四种Advice
- spring的通知(advice)
- Spring的MethodBeforeAdvice实现原理探究&&实现一个简单的Advice
- Spring的MethodBeforeAdvice实现原理探究&&实现一个简单的Advice
- Spring Aop源码学习--Advice通知
- Spring-基于Annotation的Advice
- spring aop advice注解实现的几种方式
- Spring中的AOP(四)——在Advice方法中获取目标方法的参数
- Spring中的AOP(四)——在Advice方法中获取目标方法的参数
- Spring Aop(四)——基于Aspectj注解的Advice介绍
- Spring源码分析----AOP概念(Advice,Pointcut,Advisor)和AOP的设计与实现
- Spring源码分析----AOP概念(Advice,Pointcut,Advisor)和AOP的设计与实现
- 5.5 Spring的通知(Advice)
- Spring源码(四)-bean的加载(上)
- Java基础20天--03--IO流
- 用pb调用IC卡读写器的程序 例子代码
- responseStream
- 20个出色基于Wordpress SEO 插件
- 猴子管理法则
- Spring的四种Advice源码探究
- 杭电acm 1213 (How many tables)
- responseText
- centos 6 VMware 安装问题
- status
- 一个很好的知识管理网站
- java script
- ArcGIS Server网站发布后地图显示空白的原因之一
- 嵌入式GUI FTK 界面设计器