文档章节

Spring3.1.0实现原理分析(十).AOP之代理对象执行拦截过程

 叶琎宇
发布于 2017/05/28 22:11
字数 783
阅读 58
收藏 0

大家好,上篇博客讲解了代理对象的创建过程《AOP之创建代理对象的过程》,今天主要分析下代理对象执行拦截的过程。

        无论是jdk代理对象还是cglib代理对象,它们都持有通知列表对象,而通知对象呢其实就是AOP大联盟的方法拦截器对象(MethodInterceptor)。之所以这么说是因为,或者通知对象直接实现了MethodInterceptor接口(如:前置通知,后置通知),或者通知对象被实现了MethodInterceptor接口的对象引用(如:最终通知, 异常后通知)。总之,通知对象就是拦截器对象。MethodInterceptor接口中只定义了一个方法,Object  invoke(MethodInvocation invocation) ,在这个方法中实现拦截器的处理逻辑。

代理对象进入回调方法后,会获取所有跟被拦截方法匹配的拦截器列表,然后调用每个拦截器的invoke方法,切入处理逻辑。这里还需要再介绍一个AOP大联盟的接口,方法调用接口(org.aopalliance.intercept.MethodInvocation) ,细心的读者可能已发现,MethodInterceptor#invoke方法的唯一参数就是这个类型,这个接口及其超接口大致定义了以下几个重要的方法。

 

  • proceed()  ---  执行链中下个拦截器
  • getThis()  ---    获取被代理对象
  • Method getMethod() ---  获取被拦截的方法对象
  • getArguments() ---  获取被拦截方法的实参数组

上述第一个方法proceed(),就是调用拦截器列表的入口,用个图来描述过程更容器理解。简单的说方法代理过程就只有两个步骤:(1).执行所有拦截器; (2).执行被代理方法。    

       

        

         

        

接下来我们用一个更加具体的例子来表述上图的流程,假设有如下的配置,用户定义了四个通知器。

 

 

<aop:aspect id="logAspect" ref="logAspectBean">
			
		<!-- 定义切入点,指定切入点表达式
		<aop:pointcut id="allMethod" expression="execution(* testaop.com.qiujy.service.*.*(..))"/>
			
		<!-- 应用前置通知 -->
		<aop:before method="before" pointcut-ref="allMethod" /> 
			
		<!-- 应用后置通知 -->
		<aop:after-returning method="afterReturn" pointcut-ref="allMethod"/> 
			
		<!-- 应用最终通知 -->
		<aop:after method="after" pointcut-ref="allMethod"/> 
			
		<!-- 应用异常后通知 -->
		<aop:after-throwing method="afterThrowing" pointcut-ref="allMethod"/> 

	</aop:aspect>

 

当调用accountService代理对象的方法时,进入了回调方法,在回调方法中会获得五个拦截器(有一个是spring自动添加的),有意思的是拦截器的顺序并不是用户定义的通知器顺序,这是因为spring会对拦截器进行排序,五个拦截器的执行顺序如下,

 

  • ExposeInvocationInterceptor (Spring自动添加的,用于把方法调用对象置入线程安全的缓存)
  • MethodBeforeAdviceInterceptor (前置通知)
  • AspectJAfterThrowingAdvice (异常后通知)
  • AspectJAfterAdvice (最终通知)
  • AfterReturningAdviceInterceptor (后置通知)

完成的执行流程图如下,

 

备注: 上图是被拦截方法对象未执行异常下的流程图,如果被拦截方法抛出了异常,则后置通知不会执行,最终通知还是会被调用的,然后再调用异常后通知。  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

粉丝 4
博文 25
码字总数 36889
作品 0
宁波
高级程序员
私信 提问
分布式事务系列(1.2)Spring的事务体系

1 系列目录 - 分布式事务系列(开篇)提出疑问和研究过程- 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析- 分布式事务系列(1.2)Spring事务体系- 分布式事务系...

乒乓狂魔
2015/05/18
4.8K
4
面试必问的Spring AOP原理、SpringMVC过程

Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。 Sp...

Java干货分享
2018/10/25
316
0
深入解析Spring架构与设计原理-AOP

关于AOP的个人理解 AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为了由高到低、从使用到实现的三个层次。关于这个体系结构,个人的理解是这样的,从上往下,最高层是语言和开发环境,在...

Java小铺
2018/08/27
0
0
【分布式事务系列三】Spring的事务体系

分布式事务 【分布式事务系列一】提出疑问和研究过程 【分布式事务系列二】Spring事务管理器PlatformTransactionManager 【分布式事务系列三】Spring的事务体系 本地事务模型:开发人员不用知...

陶邦仁
2015/12/09
285
0
Spring AOP源码解析——AOP动态代理原理和实现方式

Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Str...

Jia
2016/10/31
2.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 HTML5教程 HTML5表单 新增的表单属性1

HTML5 Input表单为<form>和<input>标签添加了几个新属性,属性如表1。 1 autocomplete属性 autocomplete属性规定form或input域应该拥有自动完成功能,当用户在自动完成域中开始输入时,浏览器...

老码农的一亩三分地
52分钟前
5
0
OSChina 周五乱弹 —— 葛优理论+1

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享米津玄師的单曲《LOSER》: mv中的舞蹈诡异却又美丽,如此随性怕是难再跳出第二次…… 《LOSER》-...

小小编辑
今天
1K
18
nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
15
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部