注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

了解spring的AOP  

2011-12-13 09:46:27|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括SpringBean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。

本篇技术文章介绍Spring AOP的实现。

先来了解一下AOP的相关概念:

1)Aspect(切面):指横切性关注点的抽象即为切面。与类相似,只是两者的关注点不同,类是对物体特征的抽象,而切面是横切性关注点的抽象。

2)Joinpoint(连接点):指一些被拦截到的点。在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点,实际上连接点还可以是field或类构造器。

3)Advice(通知):指拦截到连接点之后所要做的事情,分为前置通知,后置通知,异常通知,最终通知和环绕通知。

4)Pointcut(切入点):指对那些Jointpoint进行拦截的定义。

5)Target(目标对象):代理要实现的目标对象。

6)Weave(织入):指将Aspects应用到Target对象并导致proxy对象创建的过程。

7)Introduction(引入):在不修改类代码的前提下,Introduction可以在运行期间为类动态地添加一些方法或属性

SpringAOP配置功能非常强大,如自动代理(autoproxy),提供XML和注解的配置方式。无论是哪个配置支持,其最终的本质则是通过 JdkDynamicAopProxy CglibProxyFactory 完成对象的AOP拦截支持。

下面将通过其中一种配置方式(基于Bean名称的自动代理支持),来讲解一下Spring AOP的实现原理:

下面是一个配置示例:


BeanNameAutoProxyCreator为名字匹配字符串或者通配符的bean自动创建AOP代理。

下面是BeanNameAutoProxyCreator的类图,其是实现了BeanPostProcessor接口。


在上一章节介绍Spring Bean生命周期管理的时候,介绍过BeanPostProcessor 是实现Spring在对Bean对象进行实例化前后,回调相应的方法。

那么BeanNameAutoProxyCreator就是实现了 postProcessBeforeInstantiation 方法,对Bean对象进行实现化前,进行AOP的增强操作。

核心的代码如下:


代码中,会调用createProxy 方法,实现对象实例的自动代码封装实现。

接着分析代码: createProxy方法,其实就是调用了SpringProxyFactory对象进行代理的封装实现

下面标注了主要实现代码:


接下来 AopProxyFactorySpring提供的一个接口类,Spring默认使用的DefaultAopProxyFactory实现类。

我们再来分析一下createAopProxy方法的实现, 下面标注的主要实现代码


注:上面的代码我们发现Spring对于Bean对象的AOP处理采用了两种方式,如果是有接口的类则采用JDKDynamicAopProxy,如果是普通的类,则采用CglibProxyFacotry实现。关于Cglib这个项目的说明,大家可以参见其官方网站的说明。

下面是JdkDynamicAopProxy类的代理实现,就是使用JDKProxy类进行代理处理


基于JdkDynamicAopProxy封装的实例,AOP拦截都会回调 JdkDynamicAopProxyinvoke方法

基于CglibProxyFactory则通过Cglib2AopProxygetProxy方法实现实例对象的增强

下面对其主要的代码进行标记:

至此SpringAOP的代理的封装过程已经介绍完成。下面我们来看一下AOP切面的通知机制实现。

下面就只以JdkDynamicAopProxy为例,Cglib也是类同。

刚才介绍过基于JdkDynamicAopProxy封装的实例,AOP拦截都会回调 JdkDynamicAopProxyinvoke方法

下面来分析一下invoke的主要代码:

上面的代码截取自JdkDyanmicAopProxyinvoke方法, 首先会获得所有的Advice通过方式,然后通过反射的方式来应用这些通知方式。


获后就可以根据不同的通知实现,来拦截处理方法的切面的回调操作。

SpringAOP主要实现原理过程就已经介绍完成。

  评论这张
 
阅读(1195)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018