上篇文章介绍了,调用bean工厂的后置处理器,主要分为两步:

他是在beanFactory预准备标准初始化之后执行invokBeanFactoryPostProcessor;先调用beanDefinitionRegistryPostProcessor,在调用beanFactoryPostProcessor,里面都有借口优先级。

​​Ioc容器refresh总结(2)--- Spring源码从入门到精通(三十二)​​

六、registerBeanPostProcessor(beanFactory)

注册bean的后置处理器,beanPostProcessor作用:拦截bean的创建过程,在bean初始化前后调用。Intercept bean creator。

实现beanPostProcessor的接口有:

1、DestructionAwareBeanPostProcessor,其中postProcessorBeforeDestruction容器销毁前调用的后置处理,可以destory-method指定和@PreDestory。其中对应的@PostConstrut和init-method方法是在对象初始化之前调用(也就是对象创建构造器之后调用)。

2、InstantiationAwareBeanPostProcessor类,在对象初始化前后调用,分别调用postProcessorBeforeInitialization和postProcessorAfterInitialization,及其用后置处理器postProcessPropertyValues赋值完成之后,运用解析@Autowired和@Value。

3、SmartInstantiationAwareBeanPostProcessor类,用determineCandidateConstructors推断使用啥构造函数之前,和调用getEarlyBeanReference提早获取bean,解决循环依赖,提早创建代理类。

4、MergedBeanDefinitionPostProcessor类,在预处理@autowired@Value调用postProcessorMergeBeanDefinition。

不同后置处理器的bean创建的执行时机是不一样的。

  1. 从beanFactory获取所有BeanPostProcessor类型的;后置处理器都有优先级,通过这两个接口PriorityOrdered ,Ordered指定。
  2. 优先注册PriorityOrdered接口的beanPostProcessor。

Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)_aop

把每一个BeanPostProcessor,用addBeanPostProcessor方法添加到beanFactory的BeanPostProcessor中。

  1. 再注册Ordered接口的beanPostProcessor。

Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)_初始化_02

  1. 第三步注册没有实现任何接口的beanPostProcessor。
  2. 最终注册mergedBeanDefinitionPostProcessor
  3. 注册一个applicationListenerDetector;bean创建完成之后,检测是否是 ApplicaitionListerner,是的话放在applicationContext容器中保存起来。

Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)_aop_03