实验环境:spring-framework-5.0.2、jdk8、gradle4.3.1
历史文章
- Spring源码-IOC部分-容器简介【1】
- Spring源码-IOC部分-容器初始化过程【2】
- Spring源码-IOC部分-Xml Bean解析注册过程【3】
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
- Spring源码-IOC部分-Bean实例化过程【5】
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
AOP代理对象也是在bean的实例化过程中创建的,如果不明白可以看一下bean实例化过程。如果类配置了@EnableAspectJAutoProxy注解 ,Spring则会在BeanPostProcessor.after这一步通过AnnotationAwareAspectJAutoProxyCreator这个BeanPostProcessor创建一个代理对象,替换掉了原有的bean对象返回了出去。
我们再来看一下bean创建流程
创建bean方法如下
我们看的有个applyBeanPostProcessorsAfterInitialization方法,会循环调用所有的BeanPostProcessor对当前bean做增强,如果这个bean配置了AOP代理的话,则会通AnnotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization方法创建一个代理对象。我们来看一下其父类AbstractAutoProxyCreator的实现逻辑。
我们看的是通过 proxyFactory.getProxy来创建的代理对象,调用getProxy就会返回CglibAopProxy或JdkDynamicAopProxy代理对象。
那么是怎么决定返回的是CglibAopProxy还是JdkDynamicAopProxy代理对象呢?是通过createAopProxy方法来决定的。
到此,一个代理对象就创建了出来。