spring创建aop代理对象流程分析

1.在实例化bean之后会调用AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法,该方法会找到所有实例化好的BeanPostProcessor对bean进行后置处理

spring创建aop代理对象流程分析_第1张图片

2.AbstractAutoProxyCreator的postProcessAfterInitialization方法会调用wrapIfNecessary方法对当前bean进行判断是否需要包装。判断的逻辑是首先找到容器里的所有advisor,然后遍历每一个advisor使用canApply方法去当前bean进行验证是否可以作用用当前bean,不同的advisor有不同的验证逻辑这里就先不展开了。

spring创建aop代理对象流程分析_第2张图片

3.通过getAdvicesAndAdvisorsForBean方法执行完之后返回advice和advisor类型的数组,如果数组不为空则对当前bean进行包装。下面既然createProxy方法。在这个方法里最关键做两件事1创建一个ProxyFactory,2找到当前AbstractAutoProxyCreator类中的其它interceptorNames加入specificInterceptors并对所有specificInterceptors进行包装,包装逻辑可以自己debug细究。

spring创建aop代理对象流程分析_第3张图片

4.下面就调用ProxyFactory的getProxy方法获取代理类。在getProxy方法里会调用父类ProxyCreatorSupport的createAopProxy方法先获取AopProxy实例。ProxyCreatorSupport类集成了一个AopProxyFactory实例用于抽象创建AopProxy实例方法,默认使用DefaultAopProxyFactory工厂生产AopProxy实例。在DefaultAopProxyFactory工厂里根据bean的class类型判断是生产cglib的动态代理还是jdk的spring创建aop代理对象流程分析_第4张图片

5.这里就看cglib的情况返回了ObjenesisCglibAopProxy对象。调用ObjenesisCglibAopProxy对象的getProxy方法时会调用其父类CglibAopProxy的的getProxy方法,在getProxy方法里也就是实例化及初始化一个Enhancer对象还有就是获取callback

 

spring创建aop代理对象流程分析_第5张图片

6.最后就是调用子类ObjenesisCglibAopProxy的createProxyClassAndInstance方法通过kryo生成具体代理类并设置callbackspring创建aop代理对象流程分析_第6张图片

 

你可能感兴趣的:(java,spring)