注册组件AnnotationAwareAspectJAutoProxyCreator到BeanFactory中;
二、我们需要在相关父类中找到与BeanPostProcessor接口、BeanFactoryAware接口两个接口有关的方法,并打上断点,相关的方法如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2831c9a2bfe8730c16101c09446b5789.png)
执行流程:(根据Debugger Frames一步步看运行过程)
(1)、传入配置类,创建IOC容器;
refresh()总结而言就是初始化容器(这里我们重点就看BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)这个bean的创建过程),那它是怎么调用的呢?看其内部的方法:registerBeanPostProcessors(beanFactory)
继续追溯找到方法:registerBeanPostProcessors()详解:
步骤1的参数详情:
重点来看internalAutoProxyCreator的注册过程:
由它的继承关系图可知,它的父类是继承了Ordered的接口,所以重点看第二步注册代码:
传入beanName和BeanPostProcessor类型查找Bean;
调getSingleton()、getObject()获取单实例的Bean, 因为容器还没有这个bean,所以获取不到,
这时就会创建bean调用createBean();(这个机制保证了spring的单实例bean只被创建一次);
进入AbstractAutowireCapableBeanFactory.doCreateBean()中;
然后进入AbstractAutowireCapableBeanFactory.initializeBean(){} 如图所示:
initializeBean()内部的执行过程:invokeAwareMethods(beanName, bean){setBeanFactory()>initBeanFactory}--》applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)---》invokeInitMethods(beanName, wrappedBean, mbd);---》applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
调用的是:AbstractAdvisorAutoProxyCreator类中的setBeanFactory(BeanFactory beanFactory)方法;
调用的是:AnnotationAwareAspectJAutoProxyCreator类中的initBeanFactory(ConfigurableListableBeanFactory beanFactory)方法,相当于将上一步创建的ReflectiveAspectJAdvisorFactory和beanFactory封装了一下。
这时,BeanFactory.getBean()已返回Bean,接下来就是注册Bean;
注册bean的方法:
至此, AnnotationAwareAspectJAutoProxyCreator后置处理器已注册完成;
{IOC容器在创建对象的时候会注册一些 后置处理器;在AOP中就是创建了一个AnnotationAwareAspectJAutoProxyCreator的后置处理器;}