ProxyFactoryBean生成AopProxy代理对象-3

时间:2022-12-25 16:35:35

Spring Aop的使用中,可以通过ProxyFactoryBean来配置目标对象和切面行为。在ProxyFactoryBean中,通过interceptorNames属性来配置已经定义好的通知器Advistor。虽然名字为interceptorNames,但实际上确实供Aop应用配置通知器的地方。在ProxyFactoryBean中,需要为target目标对象生成Proxy代理对象,从而为Aop横切面的编织做好准备工作。而代理对象的生成,在ProxyFactoryBeanAop实现需要依赖JDK或者CGLIB提供的Proxy特性。

下面我们从PeroxyFactoryBean进行分析。从ProxyFactoryBean中获取对象,是以getObject方法作为入口完成的;ProxyFactoryBean实现中的getObject()方法,是FactoryBean需要实现的接口。对ProxyFactoryBean来说,需要把目标对象增加的增强处理,都通过了getObject方法进行了封装,这些增强处理是为AOP功能的实现提供服务的。getObject的实现清单如下getObect()方法首先对通知器进行了初始化,通知器封装了一系列的拦截器,这些拦截器都要从配置文件中获取,然后为代理对象的生成做好准备。在生成代理对象时,因为Spring中有singleton类型和prototype类型这两种不同的bean,所有要对代理对象进行一个区分。

生成代理对象AopProxy入口方法调用流程图:

 ProxyFactoryBean生成AopProxy代理对象-3

 

ProxyFactoryBeangetObject

 

———————————————————————————————————————------------------------

ProxyFactoryBean生成AopProxy代理对象-3

getObject方法中,首先是对通知器链进行初始化initializeAdvisorChain()

 ProxyFactoryBean生成AopProxy代理对象-3

 

initializeAdvisorChain方法中通过ioc容器获取到interceptor对象后将继续调用addAdvisorOnChainCreation()interceptor对象添加到通知器链中

 ProxyFactoryBean生成AopProxy代理对象-3

addAdvisorOnChainCreation()方法中首先会调用namedBeanToAdvisor(next)方法,将从ioc容器获取的普通对象转换成通知器Advisor对象。

 ProxyFactoryBean生成AopProxy代理对象-3

namedBeanToAdvisor()方法中将会继续调用AdvisorAdapterRegistry接口的默认实现DefaultAdvisorAdapterRegistry类中的wrap方法进行转换,继续看wrap方法

 ProxyFactoryBean生成AopProxy代理对象-3

 

wrap方法中,首相判断传入的对象是否是advisor对象,如果是则直接强转为Advisor后返回,如果没有实现Advice通知则直接抛出异常,如果实现了Advice通知则直接强转为Advice再判断是否是MethodInteceptor的子类,如果是,直接产生默认的advisor,如果是adapters中的任意子类,则也生成默认的advisor。这里的adapters具体是指DefaultAdvisorAdapterRegistry类中的adapters属性,就是advice通知所要继承的类,也就是在哪里进行切入,如前置通知,后置通知,异常通知

 ProxyFactoryBean生成AopProxy代理对象-3

 

以上就是初始化advisor链,生成代理的核心数据。

———————————————————————————————————————--------------------


接着在getObject()方法中,将会执行getSingletonInstance()方法,该方法主要是生成代理对象并封装对target目标对象的调用(即加入拦截器)。具体的生成过程是,首先读取ProxyFactoryBean中的配置,为生成代理对象做好必要的准备,比如设置代理的方法接口调用等。Spring通过AopProxy类来具体生成代理对象。对于getSingletonInstance()方法中代理对象的生成过程,代码清单如下:

 ProxyFactoryBean生成AopProxy代理对象-3

首先是获取代理对象的接口并调用setInterfaces()方法设置代理对象的接口,然后通过调用ProxyCreatorSupport类中的createAopProxy()方法,在ProxyCreatorSupport类中存在一个aopProxyFactory属性,默认为DefaultAopProxyFactory类型,在ProxyCreatorSupport类中的createAopProxy()方法中,通过调用DefaultAopProxyFactory类中的createAopProxy()方法来生成代理对象。以下是ProxyCreatorSupport类中的主要方法

 ProxyFactoryBean生成AopProxy代理对象-3

ProxyFactoryBean生成AopProxy代理对象-3

 

 

 

这里的this参数主要是传递通知器链,因为ProxyCreatorSupport继承了AdivsedSupport类,因此这里传递的就是advice通知器链。

 

DefaultAopProxyFactory类中,将会调用createAopProxy()来生成代理对象,关于AopProxy代理对象的生成,需要考虑使用哪种方式,如果目标对象是接口类,那么适合使用JDK来生成代理对象,否则Spring会使用CGLIB来生成目标对象的代理对象。为了满足不同的代理对象的生成要求,DefaultAopProxyFactory作为AopProxy对象的生产工厂,可以根据不同的需要生成这两种AopProxy对象。具体代码如下:

 ProxyFactoryBean生成AopProxy代理对象-3

这里我们主要看JDK生成代理对象,这里的new JdkDynamicAopProxy(config) 主要是设置advice通知属性到将要生成的代理对象中,并返回一个JdkDynamicAopProxy类型的对象。接着在ProxyCreatorSupport类中将会调用本类的getProxy()方法:

 ProxyFactoryBean生成AopProxy代理对象-3

getProxy()方法中,传递的aopProxy是上面方法传递回来的JdkDynamicAopProxy对象。这个aopProxy通过调用JdkDynamicAopProxy类中的getProxy方法来生成具体的代理对象,代码如下:

 ProxyFactoryBean生成AopProxy代理对象-3

 

最后通过调用Proxy.newProxyInstance()方法生成代理对象。