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的实现原理和机制会单独写一篇文章。
- spring代理对象的生成及运行机制源码解读
- Spring AOP源码解读3 - 代理的生成
- Spring AOP 代理对象的生成 part3
- Spring AOP源码分析(生成代理对象)
- spring的配置加载原理及源码解读
- spring aop实现过程之一代理对象的生成
- spring生成代理对象的过程(AOP切面)
- Aop源码分析之生成代理对象
- Spring:AOP(一)生成代理对象
- 动态代理源码解读
- spring 代理对象方法增强源码解析
- jdk动态代理生成代理对象源码分析-4
- Mybatis代理对象的生成
- spring框架Proxy-代理模式(动态生成代理对象)
- spring源码解读-InitializingBean的实现方法
- spring源码解读 Bean的依赖注入
- 从源码解读context对象的作用
- Spring 注解 的运行机制
- C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求
- 贝叶斯方法(Bayesian approach) —— 一种概率解释(probabilistic interpretation)
- OC 对象的内存存储细节(类方法及对象方法的调用细节)
- RTP协议分析
- Nginx配置文件nginx.conf详解
- spring代理对象的生成及运行机制源码解读
- 汉诺塔问题
- linux中进程的管理
- 开发问题总结
- jq鼠标移入移出元素呈现淡入淡出效果总结
- 电池容量工作时间如何计算
- jQuery 选择器
- BigDecimal divide
- android 性能优化(不断收集更新)