Spring源码学习(二)------ AOP

原创 2011年01月13日 20:54:00

AOP有些特有的概念,如:advisor、advice和pointcut等等,使用或配置起来有点绕,让人感觉有些距离感,其实它的实现就是一组标准的设计模式的组合使用:Factory、Proxy、Chain of Responsibility,只要搞清楚这几个设计模式,读AOP的源码是比较容易的。

首先看看ProxyFactoryBean这个类,这是AOP使用的入口,从AOP拿到的bean object就是ProxyFactoryBean.getObject得到的,从这条线下去,发现AOP就是通过Proxy模式从实际要执行的target做了包装,而Proxy还不止一套方案,通过Factory封装了两套Proxy实现方案:JDK 动态Proxy和Cglib Proxy。有两套实现主要是因为JDK 动态Proxy必须要target实现某个接口,如果不满足这个条件就会用Cglib增强字节码的方式来实现proxy。

就拿JDK Proxy为例,Spring AOP使用了标准的JDK提供的动态Proxy方案,我们先看看标准的动态Proxy是什么样子,看下面类图:

Cilent通过Proxy.newProxyInstance(classLoader, proxiedInterfaces, invocationHandler);就能拿到target的proxy object,在执行target的方法时就会先执行到DynamicProxy中的invoke方法从而实现代理包装。基于这个道理来看Spring AOP的实现,实际上就是标准地基于这个方式来做的,Spring AOP的所有花招都体现在JdkDynamicAopProxy.invoke中(当然在Cglib中是通过callback来做的,道理类似)。

通过看JdkDynamicAopProxy.invoke的源码会发现,Spring AOP的各种花招是通过Chain of Responsibility模式串起来的,先看看一个标准的Chain of Responsibility是什么样子,看下面的类图:

而Chain of Responsibility的关键在于Invocation与Interceptor的配合,主要原则就两条:

1)Invocation需要维护Interceptor集合和游标,每次调用invoke时需要先调用游标所在的Interceptor.invoke,如果游标已超过最后一个Interceptor,则调用实际target的方法

2)Interceptor的invoke中除了要执行自己的拦截逻辑,还要通过Invocation.invoke把调用传递下去,拦截的灵活性就体现在Invocation.invoke执行与否和执行的顺序。

以上逻辑通过时序图来看,如下图所示:

理解Chain of Responsibility后再来看Spring AOP,JdkDynamicAopProxy.invoke做的事情就是以上Client做的事情,

1)首先通过this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);组装interceptor chain

2)然后new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);得到invocation

3)最后通过invocation.proceed();启动责任链

而Spring AOP的那些概念都体现在组装interceptor chain中,advisor、advice和pointcut无非就是帮助你描述如何对Target进行拦截,对这一块感兴趣的朋友可以好好读读里面的代码。另外,Spring AOP提供了各种各样的Interceptor,来实现各种形式的横切,具体做法可以详细看看各Interceptor的实现。

综上所述,整个流程如下图所示:

总之,把握了Factory、Proxy、Chain of Responsibility的运用也就把握了Spring AOP的实现原理,道理虽然简单,但其中的精髓和原由还是值得我们继续深思的。

spring框架学习(六)AOP

AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象。    AOP的引入  在OOP面向对象的使用...
  • lishuangzhe7047
  • lishuangzhe7047
  • 2014年03月15日 23:36
  • 51563

spring源码剖析(六)AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上...
  • fighterandknight
  • fighterandknight
  • 2016年04月23日 17:22
  • 19565

Spring AOP源码解读1 - 程序入口

前言 最近看了《从零开始写JavaWeb框架》,想比较一下Spring AOP的实现方式和书的上实现方式有什么不同,所以先把Spring AOP的源码读一下,再进行比较。 Spring的源...
  • hotdust
  • hotdust
  • 2016年12月11日 17:34
  • 965

(八)Spring核心框架 - AOP的原理及源码解析

一、AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象;切面通常包括对于基础的增加应用;配置是指AOP体系中提供的配置环境或者编织配置,通过该配...
  • leicool_518
  • leicool_518
  • 2015年02月09日 16:31
  • 2983

Spring学习笔记---4-AOP代码实现及源码解释

一、AOP的实现者       AOP的工作目标就是将横切的问题,如:性能监控,事务处理,日志处理等,进行模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接...
  • weikeke410
  • weikeke410
  • 2016年01月18日 14:48
  • 675

spring的IOC与AOP读源码小记

读spring中IOC、AOP事务的一些笔记
  • sgls652709
  • sgls652709
  • 2015年10月29日 02:52
  • 1513

Spring源码学习(二)------ AOP

转自http://blog.csdn.net/cutesource/article/details/6136275 AOP有些特有的概念,如:advisor、advice和pointcut等等,...
  • yuxj1988
  • yuxj1988
  • 2013年11月13日 15:25
  • 582

Spring AOP 学习的好例子 仔细理解一定能学会的!

第一次写博客!心情还是蛮激动的! 虽然水品一般!但是我是知识的传播者!希望能把好的文章分享给大家!       好了,言归正传,开始我们的  spring aop 的开心学习之旅吧!      本文转...
  • u011225629
  • u011225629
  • 2015年04月22日 11:11
  • 5398

做一个合格的程序猿之浅析Spring AOP源码(十八) Spring AOP开发大作战源码解析

其实上一篇文章价值很小,也有重复造轮子的嫌疑,网上AOP的实例很多,不胜枚举,其实我要说的并不是这个,我想要做的就是上一节中spring的配置文件: 我们这边并没有用到我们上几节分析的哪几个AOP的...
  • linuu
  • linuu
  • 2016年03月26日 13:46
  • 1196

spring系列文章(一)AOP源码分析

BeanNameAutoProxyCreator与ProxyFactoryBean区别我们项目用到的是BeanNameAutoProxyCreator,说道aop可能大家更熟悉的是ProxyFacto...
  • flying_panda
  • flying_panda
  • 2015年07月16日 21:01
  • 1212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring源码学习(二)------ AOP
举报原因:
原因补充:

(最多只允许输入30个字)