SpringAOP的实现过程

来源:互联网 发布:傅园慧网络直播平台 编辑:程序博客网 时间:2024/05/24 08:32

SpringAop作为Spring的核心模块,通过该模块可以横向抽取一些公共方法,使我们能更好的面向模块开发程序;

AOP的几个基本概念,通知(有方位信息实现不同的Advice接口)、切点(通过正则或其他匹配方式来完成匹配,都实现Pointcut顶层接口,对象有matches()方法)、通知器Advisor(封装通知和切点的对象)等。在这些基础的定义后,通过Spring容器进行横向织入,实现AOP

Spring AOP主要是通过目标对象的代理,拦截器拦截回调,实现功能的。所以首先是要获取代理对象;这一步是以ProxyConfigAdvisedSupportProxyCreatorSupport和它的三个子接口AspectJProxyFactoryProxyFactoryProxyFactoryBean来产生代理对象;下面的三个子接口是产生代理对象的三种方式,AspectJProxyFactory是使用AspectJAOP实现的,ProxyFactory是通过编程设置组件形式产生的,而ProxyFactoryBean是通过声明式配置方式,完成AOP功能,所以可采用第三种方式;

在使用ProxyFactoryBean产生代理对象时,首先需要1、通知器的获取(封装在AdvisedSupport中);2、设置ProxyFactoryBean所需的代理接口、通知器名称、目标target等;有了这些组件,便可以在ProxyFactoryBean中进行生产代理对象。ProxyFactoryBean会通过getObject()方法获取实例FactoryBean,其中封装了所需要的拦截器,target等配置,为获取代理对象准备好了条件,然后借助AopProxy接口下的具体实现类(动态代理类JdkDynamicAopProxy或者CGLIBCglibProxyFactory)来生成具体的代理对象,器AopProxy的实例也是由AopProxyFactory的默认实现类DefaultAopProxyFactory来完成。

创建好代理对象之后,下一步来分析如何完成目标对象增强的织入。首先当对目标对象进行方法调用时,由于JVM的拦截机制,方法的调用会被代理对象拦截,然后完成AOP作用的功能实现主要是在继承InvocationHandle接口的handle实例中的invoke()方法,它可以完成目标方法的回调;同时,在这个invoke()方法中封装了拦截器链ReflectiveMethodInvocation对象,其中每一个拦截器都封装了带有切点的通知器,切点中含有matches()方法可以判断是否在某一切点实现织入增强;ReflectiveMethodInvocation对象中还有一个proceed()方法,可以获取下一个拦截器,沿着链行进,完成所有的匹配过程。

1 0