Spring封装的动态代理

看proxyFactory.addAdvice主要干了什么?

看下继承关系:

Spring封装的动态代理_第1张图片

 将advisor加入advisors

Spring封装的动态代理_第2张图片

 

 
  

看下如何生成代理对象

org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy 

Spring封装的动态代理_第3张图片

org.springframework.aop.framework.DefaultAopProxyFactory#hasNoUserSuppliedProxyInterfaces

Spring封装的动态代理_第4张图片 判断是否有接口,没有接口直接返回true

 如果是接口或者代理类直接返回jdk动态代理

否则返回cglib代理 

org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)

看看如何创建代理对象。

Spring封装的动态代理_第5张图片

 org.springframework.aop.framework.ObjenesisCglibAopProxy#createProxyClassAndInstance

真正的创建代理对象的逻辑:

org.springframework.cglib.proxy.Enhancer#createHelper

org.springframework.cglib.core.AbstractClassGenerator#create

看下代理对象执行过程:

 org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept

org.springframework.aop.framework.ReflectiveMethodInvocation#proceed 

责任链模式,第一次肯定不会相等。

Spring封装的动态代理_第6张图片

 这里会调用我们手写的方法,然后执行processor

 

Spring封装的动态代理_第7张图片

 再次进来回去执行目标方法

 Spring封装的动态代理_第8张图片

 这样就反射到目标方法了,整个流程结束。

1.总结:核心逻辑,重要代码如下:

org.springframework.aop.framework.AdvisedSupport#addAdvice(int, org.aopalliance.aop.Advice)

装饰者模式:advisor包括advice

Spring封装的动态代理_第9张图片

 2.代理对象使用哪种模式,jdk or cglib

org.springframework.aop.framework.ProxyFactory#getProxy()

3.代理对象的产生

org.springframework.aop.framework.CglibAopProxy#getProxy()

org.springframework.aop.framework.CglibAopProxy#createProxyClassAndInstance

org.springframework.cglib.proxy.Enhancer#createHelper

org.springframework.cglib.core.AbstractClassGenerator#create

4.代理对象执行业务逻辑:

org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept

获取所有执行链

org.springframework.aop.framework.AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice

Spring封装的动态代理_第10张图片

 获取拦截器

org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry#getInterceptors

Spring封装的动态代理_第11张图片

 这里有个拦截器 c$1

org.springframework.aop.framework.ReflectiveMethodInvocation#ReflectiveMethodInvocation

构造对象,interceptorsAndDynamicMethodMatchers这个有值了,后续会使用到

 
  

Spring封装的动态代理_第12张图片

 org.springframework.aop.framework.ReflectiveMethodInvocation#proceed

第一次肯定不会去执行代理逻辑:

 下面回去执行我们写的代理逻辑,然后执行 invocation.proceed();

 再次进来就会去反射执行目标方法,目标方法执行完了,整个流程结束

你可能感兴趣的:(spring)