您的位置:首页 > 编程语言 > Java开发

Spring:Aop实现解析

2017-11-26 13:54 113 查看

Spring:Aop实现解析

AOP联盟定义AOP组成结构:



Adivce 通知

通知定义在连接点做什么,为切面增强提供织入的接口。如BeforeAdvice,AfterAdvice等。

PointCut切点

切点是对增强的地方的描述。比如要切入一个点,这个点是怎么样的?这个时候,我们可以通过描述,来定位出这个点。符合描述的,就是这点啦。PointCut中,通过使用MethodMatcher的matches方法来获取描述。这个matches方法和正则表达式类似。

Advisor 通知器

完成对Advice和PointCut的结合。通过Advisor,可以定义应该使用哪个通知,并在哪个Pointcut使用这个通知。

设计原理: 其实就是保存一个PointCut和一些Advice,当调用的方法符合PointCut的时候,使用保存在同一个Advisor中的Advice。

Aop核心:

Aop的核心其实就是动态代理技术。在用JDK生成AopProxy代理对象的时候,配置ProxyFactoryBean:在IoC环境中创建Aop应用的底层方法。Spring通过它来完成堆AOP使用的封装。

了解之前,我们回顾如何使用XML配置ProxyFactoryBean和AOP:



1)定义使用的通知器Advisor,这个Adivsor作为一个Bean来定义,Advisor用作连接Advice通知和Pointcut关注点。

2 )定义 ProxyFactoryBean,它是封装AOP功能的主要类。在配置ProxyFactoryBean时,设定如interceptorNames(拦截器)和target等。

interceptorname属性:通过设置为要定义的通知器Advisor,这些通知器是使用代理对象的拦截器机制起作用的,提供AOP应用配置已经定义好的通知器的地方。

target:需要用AOP通知其中的切面应用来增强的对象。

ProxyFactoryBean生成AopProxy代理对象

代理对象的生成由JDK的Proxy或CGLIB完成。第一次初始化代理对象发生在第一次获取代理对象的时候。初始化完成之后,会读取配置器中出现的所有的通知器,把通知器的名字交给容器的
getBean
方法。

AopProxy生成流程:



设计原理

在Spring AOP通过JDK的Proxy方式或CGLIB方式生成代理对象的时候,都是把相关的拦截器配置到代理对象当中。代理对象会封装对target目标对象的调用,所有的调用都会被拦截下来。

SpringAOP拦截器调用的实现

在Spring AOP通过JDK的Proxy方式或CGLIB方式生成代理对象的时候,相关的拦截器已经配置到代理对象中去了,拦截器就是通过对目标方法的拦截回调来完成的。

AOP拦截器链的调用

在运行拦截器的拦截方法之前,需要对代理对象的方法完成一个匹配判断,通过的才运行拦截方法。这个匹配判断就是前面提到的,Pointcut切点中需要进行的matches过程。每个拦截链中的拦截器都要进行这个匹配。只有到了拦截链的末尾,才运行目标方法。

目前,已经看到了AOP对目标对象方法的增强。那么,这些Advisor是如何配置到拦截器中的。Advice是怎么样用的,这个是接下来了解的重点。

配置通知器

这个的一个问题就是:在代理对象对目标方法的拦截过程中,如何获取到拦截器的。取得拦截器的工作是由一个配置好的advisorChainFactory来完成的,它是一个生成通知器链(是通知器Advisor没错)的工厂。

在获取的过程中:

1.首先,获取由XML配置的的通知器Adviisro组成的List,这个配置是intercepterNames。

2.然后,对XML配置中的通知器Advisor进行拦截器的注册(AdvisorAdapterRegistry),这个注册对Advice通知的织入功能有较大作用。

3.有了Advisor注册器,通过它来从ProxyFactoryBean的配置中得到的通知Advice进行适配,从而获得了相应的拦截器,再把它加入到前面设置好的List中,完成所谓的拦截器注册过程。

注意:从XML配置中获得Advisor,是委托IoC容器,使用getBean方法完成的。

Advice通知的实现

经过前面的分析,了解到,在生成代理对象的时候,同时拦截器也被建立起来了。那么,Advice如何完成堆目标方法的增强呢?

在获取得拦截器链的过程中,由DefaultAdvisorChainFactory实现拦截器链的生成,生成Advisor的过程中,有适配Advice和注册的过程。在Advisor适配和注册的时候,Spring加入了对AOP的处理。

DefaultAdvisorChainFactory的实现:

1.构造GlobalAdvisorAdapterRegistry单例。这个的作用之后会讲。

2.对在XML配置的Advisor(就是interceptorNames)进行逐个遍历;

3.对XML配置中的Advice通知进,由GlobalAdvisorAdapterRegistry来完成拦截器的适配和注册过程。

DefaultAdvisorAAdapterRegistry的实现

设置了一系列的适配器,这些适配器为advice提供编织能力。

1.根据Advice的类型(Before,After等),不同的类型的Advice注册不同的AdviceInterceptor(通知拦截器)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring aop 结构