spring代理对象的生成及运行机制源码解读

来源:互联网 发布:shadow web 黑暗网络 编辑:程序博客网 时间:2024/05/01 01:40

spring有非常多的地方都是使用代理的,但是这些什么使用代理,使用哪种代理,代理是在什么时候创建的,怎么运行起效的。这些问题都会是下面的源码中实现的。
1、代理是怎么创建的,什么时候创建的,为什么创建
spring的代理创建类都是AbstractAutoProxyCreator的子类,这个抽象类同时又是InstantiationAwareBeanPostProcessor的实现类。
由于它是BeanPostProcessor的实现类,下面的两个方法就非常重要:
这里写图片描述
(图1.1.1)
这部分代码是在getBean -> doCreateBean时在调用bean的自定义初始化方法之前调用的,从源码中看出如果当前的bean有自定义的目标源对象时创建代理,如果生成了代理,将不再调用bean的自定义初始化方法。
这里写图片描述
(图1.1.2)
这部分代码是在getBean -> doCreateBean时在调用bean的自定义初始化方法之后调用的。
这里写图片描述
(图1.1.3)
从上面源码中看出getAdvicesAndAdvisorsForBean 从所有advisors中获取这个方法 有没切面有没有符合当前bean的advisor ,如果有则包装成代理。
这里写图片描述
(图1.1.4)
在创建代理的源码中看出,会创建一个ProxyFactoy(spring默认使用),会把所有的建言者放进这个代理工厂中去,并返回代理对象。
这里写图片描述
(图1.1.5)
这里写图片描述
(图1.1.6)
这里写图片描述
(图1.1.7)
ProxyFactory 是ProxyCreatorSupport(是AdvisedSupport的子类)的子类
是默认使用DefaultAopProxyFactory来实现,同时AdvisedSupport传过去,也就是他自己,这样就把所有的建言信息放到了具体代理创建着中。

2、代理的是怎么区分创建的
这里写图片描述
(图2.1.1)
从以上源码中看出,当被代理的对象是接口使用的是jdk动态代理,否则使用的是cgLib动态代理。

3、代理的运行机制
3.1、jdk动态代理的执行机制
这里写图片描述
(图3.1.1)
这里写图片描述
(图3.1.2)
JDK 动态代理从当前代理的adivsorsupport中获取出所有切面建言信息,交由reflectiveMehtodInvocation执行。注意this.advised是advisorSupport的对象名(也就是创建代理时候放进去的),不是Advisor。
如上代码,如果没有建言则直接调用方法,否则把建言委托给ReflectiveMethodInvocation来执行

3.2、cglib动态代理
这里写图片描述
(图3.2.1)
这里写图片描述
(图3.2.2)
从源码可以看出cglib的代理和jdk动态代理执行方式基本一致。都是交由reflectiveMehtodInvocation执行。
这里写图片描述
ReflectiveMethodInvocation 是所有执行被代理方法的核心类 所有代理都继承或使用它的process 使用它的是JdkDynamicAopProxy,继承他的是CglibMethodInvocation

注:此文只说明了代理对象的创建时间及创建原因,及使用哪种代理的区分和简单的运行原理。
对于spring 代理的详细原理介绍,结构,及cglib的实现原理和机制会单独写一篇文章。

1 0
原创粉丝点击