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

Spring AOP 深入分析

2016-05-05 21:04 513 查看
Advice通知是AOP联盟定义的一个接口,定义当拦截到连接点做相应的处理操作,为切面增强提供织入接口。在spring AOP中,通知主要描述Spring AOP围绕方法调用而注入切面的行为,Spring AOP的通知扩展了AOP联盟的通知接口,提供了前置通知BeforeAdvice、后置通知AfterReturnAdvice、最终通知AfterAdvice和例外通知ThrowAdvice等。

public 返回类型 方法名(参数列表){ ——>环绕通知
方法前处理代码    ——>     **前置通知**
try{
方法具体实现(方法体)…….
方法后处理代码    ——>     **后置通知**
}Catch(异常类型 e){
异常处理……       ——>     **例外通知**
}finally{
最后处理代理……       ——>     **最终通知**
}
}


Spring 支持 @AspectJ annotation style 的方法和基于模式的方法来实现自定义方面.

1.Spring AOP的底层实现常用类:

分析Spring AOP的底层实现首先要从ProxyConfig类开始,ProxyConfig是所有产生Spring AOP代理对象的基类,它是一个数据类,主要为其AOP代理对象工厂实现类提供配置属性。根据ProxyConfig的继承体系分析创建AOP代理常用类的作用:

1.AdvisedSupport是ProxyConfig的子类,它封装了AOP中对通知(Advice)和通知器(Advisor)的相关操作,这些操作对于不同的AOP的代理对象的生成都是一样的,但对于具体的AOP代理对象的创建,AdvisedSupport把它交给子类去实现。

2.ProxyCreatorSupport是AdvisedSupport的子类,它是其子类创建AOP代理对象的一个辅助类,提供不同AOP代理对象生成的通用操作,具体的AOP代理对象生成,由ProxyCreatorSupport的子类完成。

3.创建AOP代理对象的类:

ProxyCreatorSupport有3个子类,分别创建不同的AOP代理对象,具体如下:

a.AspectJProxyFactory:主要用于创建AspectJ的AOP应用,起到集成Spring和AspectJ的作用。

b.ProxyFactory:创建编程式的Spring AOP应用。

c.ProxyFactoryBean:创建声明式的Spring AOP应用。



public class AdvisedSupport extends ProxyConfig implements Advised {
}


2.声明式Spring AOP代理工厂对象ProxyFactoryBean

我们以ProxyFactoryBean为例,分析Spring AOP的实现原理,ProxyFactoryBean是Spring中一个非常灵活的创建AOP应用的底层方法,封装了AOP的主要功能。

<!--配置通知器,通知器的实现定义了需要对目标对象进行的增强行为-->
<bean id=”testAdvisor” class=”com.test.TestAdvisor”/>
<!--配置AOP代理,封装AOP功能的主要类-->
<bean id=”testAOP” class=”org.springframework.aop.ProxyFactoryBean”>
<!--AOP代理接口-->
<property name=”proxyInterfaces”>
<value>com.test.TestProxyInterface</value>
</property>
<!--需要使用AOP切面增强的对象-->
<property name=”target”>
<bean class=”com.test.TestTarget”/>
</property>
<!--代理拦截器,配置通知器的名称,即通知器在AOP代理的配置下通过使用代理对象的拦截机制发挥作用-->
<property name=”interceptorNames”>
<list>
<value>testAdvisor</value>
</list>
</property>
</bean>


3.ProxyFactoryBean生成AOPProxy代理对象

从2中ProxyFactoryBean的简单配置例子我们可以看出,ProxyFactoryBean是用来配置目标对象和切面行为Advice的,ProxyFactoryBean通过其配置的拦截器名称interceptorNames即通知器Advisor将切面行为Advice应用到目标对象中。

在ProxyFactoryBean中,需要为待增强目标对象目标对象生成Proxy代理对象,从而为AOP切面的编织提供基础,下面通过源码分析ProxyFactoryBean的生成AOPProxy代理对象的实现过程:

通过源码分析,我们了解到AOPProxyFactory实现了FactoryBean接口,所以本身也是一个Spring的工厂Bean,AOP代理工厂的主要功能概况为:

a.初始化通知器链,将配置的通知器链添加到容器存放通知/通知器的集合中。

b.根据单态模式/原型模式,获取AOPProxy产生AOPProxy代理对象。

(2).AOP创建辅助器(AOPCreatorSupport)获取AOPProxy代理对象:

AOPProxyFactory的getSingletonInstance和newPrototypeInstance方法均通过调用AOPCreatorSupport的createAopProxy()方法获取AOPProxy.通过对ProxyCreatorSupport的源码分析,我们知道真正创建AOPProxy代理对象的是DefaultAopProxyFactory类。

(3).DefaultAopProxyFactory创建AOPProxy代理对象:

DefaultAopProxyFactory是AOP创建辅助器(AOPCreatorSupport)默认的AOP代理工厂,DefaultAopProxyFactory的createAopProxy方法实现了创建AOP代理的功能,通过对DefaultAopProxyFactory的源码分析,我们了解了Spring在创建AOP代理对象时,如果配置的目标类是接口,则使用JDK的动态代理机制来生成AOP代理,如果使用的不是接口,则使用CGLIB方式来生成AOP的动态代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: