上篇文章介绍了,调用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创建的执行时机是不一样的。
从beanFactory获取所有BeanPostProcessor类型的;后置处理器都有优先级,通过这两个接口PriorityOrdered ,Ordered指定。
优先注册PriorityOrdered接口的beanPostProcessor。
把每一个BeanPostProcessor,用addBeanPostProcessor方法添加到beanFactory的BeanPostProcessor中。
- 再注册Ordered接口的beanPostProcessor。
- 第三步注册没有实现任何接口的beanPostProcessor。
- 最终注册mergedBeanDefinitionPostProcessor
- 注册一个applicationListenerDetector;bean创建完成之后,检测是否是 ApplicaitionListerner,是的话放在applicationContext容器中保存起来。