Spring框架学习[创建AOP代理对象并对目标对象切面拦截](一)

2014-11-24 03:05:49 · 作者: · 浏览: 6

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应用。

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

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

一个简单的AOP代理工厂对象的配置如下:

[xhtml] view plaincopyprint com.test.TestProxyInterface testAdvisor

3.ProxyFactoryBean生成AOPProxy代理对象:

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

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

(1).ProxyFactoryBean产生代理对象的主要源码:

[java] view plaincopyprint public class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean , BeanClassLoaderAware, BeanFactoryAware { //标注通知器器为全局通用通知器 public static final String GLOBAL_SUFFIX = "*"; //标志通知器链是否已经完成初始化 private boolean advisorChainInitialized = false; //单态模式对象 private Object singletonInstance; …… //ProxyFactoryBean创建AOPProxy代理的入口方法 public Object getObject() throws BeansException { //初始化通知器链 initializeAdvisorChain(); //如果目标对象是单态模式 if (isSingleton()) { //调用获取单态模式对象的方法产生AOPProxy代理 return getSingletonInstance(); } //如果目标对象是原型模式 else { if (this.targetName == null) { logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " + "Enable prototype proxies by setting the 'targetName' property."); } //调用原型模式对象方法每次创建一个新的AOPProxy代理对象 return newPrototypeInstance(); } } //初始化通知器链 private synchronized void initializeAdvisorChain() throws AopConfigException, BeansException { //如果通知器链已经被初始化,则直接返回,即通知器链只在第一次获取代理对象时产生 if (this.advisorChainInitialized) { return; } //如果ProxyFactoryBean中配置的连接器列名名称不为空 if (!ObjectUtils.isEmpty(this.interceptorNames)) { //如果没有Bean工厂(容器) if (this.beanFactory == null) { throw new IllegalStateException("No BeanFactory available anymore (probably due to serialization) " + "- cannot resolve interceptor names " + Arrays.asList(this.interceptorNames)); } //全局通知器不能是通知器链中最后一个,除非显式使用属性指定了目标 if (this.interceptorNames[this.interceptorNames.length - 1].endsWith(GLOBAL_SUFFIX) && this.targetName == null && this.targetSource == EMPTY_TARGET_SOURCE) { throw new AopConfigException("Target required after globals"); } //遍历通知器链,向容器添加通知器 for (String name : this.interceptorNames) { if (logger.isTraceEnabled()) { logger.trace("Configuring advisor or advice '" + name + "'"); } //如果通知器是全局的 if (name.endsWith(GLOBAL_SUFFIX)) { if (!(this.beanFactory instanceof ListableBeanFactory)) { throw new AopConfigException( "Can only use global advisors or interceptors with a L