Spring封装的动态代理

看proxyFactory.addAdvice主要干了什么?

看下继承关系:

 将advisor加入advisors

 

 

看下如何生成代理对象

org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy 

org.springframework.aop.framework.DefaultAopProxyFactory#hasNoUserSuppliedProxyInterfaces

 判断是否有接口,没有接口直接返回true

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

否则返回cglib代理 

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

看看如何创建代理对象。

 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 

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

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

 

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

 

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

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

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

装饰者模式:advisor包括advice

 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

 获取拦截器

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

 这里有个拦截器 c$1

org.springframework.aop.framework.ReflectiveMethodInvocation#ReflectiveMethodInvocation

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

 

 org.springframework.aop.framework.ReflectiveMethodInvocation#proceed

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值