流程图
Spring中的两大回调接口作用:
org.springframework.beans.factory.config.BeanFactoryPostProcessor
org.springframework.beans.factory.config.BeanPostProcessor
BeanFactoryPostProcessor相关接口的注册 + 回调处理顺序
BeanFactoryPostProcessor还有一个子接口为org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor拓展了一个方法为
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
在对象工厂BeanFactory创建完毕而且正常的BeanDefinition都已经加载完毕而且尚未初始化时调用。
用来修改BeanDefinitionRegistry
顺序:
1.直接注册到AbstractApplicationContext中的beanFactoryPostProcessors且类型为BeanDefinitionRegistryPostProcessor 执行
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
2.被BeanFactory通过AbstractRefreshableApplicationContext创建BeanFactory时的loadBeanDefinition加载的(或者第一步修改registry注册进去的)类型为
BeanDefinitionRegistryPostProcessor的而且实现了PriorityOrdered接口的BeanDefinition。
然后根据getOrder()的值通过排序器((DefaultListableBeanFactory) beanFactory).getDependencyComparator()
如果不存在则用OrderComparator.INSTANCE。调用postProcessor.postProcessBeanDefinitionRegistry(registry);
3.被BeanFactory通过AbstractRefreshableApplicationContext创建BeanFactory时的loadBeanDefinition加载的(或者第一步、第二步修改registry注册进去的)类型为
BeanDefinitionRegistryPostProcessor的而且实现了Ordered接口的BeanDefinition,然后根据getOrder()的值通过排序器
((DefaultListableBeanFactory) beanFactory).getDependencyComparator()如果不存在则用OrderComparator.INSTANCE。
调用postProcessor.postProcessBeanDefinitionRegistry(registry);
注意:PriorityOrdered是Ordered的子接口,因此这里就算第二部注册了一些实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor,
仅仅会根据getOrder()值进行排序执行的。
4.到这可能会由3步骤产生新的BeanDefinitionRegistryPostProcessor类型的BeanDefinition,而且每一次调用都可能会产生新的该类型BeanDefinition
这里直接循环(+ 排序)调用postProcessor.postProcessBeanDefinitionRegistry(registry);,
直至没有需要处理的BeanDefinitionRegistryPostProcessor类型的为止。
5.执行上面获取的所有BeanPostProcessor中的postProcessor.postProcessBeanFactory(beanFactory);
虽然BeanDefinitionRegistryPostProcessor为BeanPostProcessor的子类,但是上面处理并没有开始执行postProcessor.postProcessBeanFactory(beanFactory);
方法,这一步直接全部挨个先调用BeanDefinitionRegistryPostProcessor的postProcessBeanFactory(beanFactory)后调用
上面从AbstractApplicationContext中获取的类型不为BeanDefinitionRegistryPostProcessor以及1、2、3、4获取的类型为BeanPostProcessor的
postProcessBeanFactory(beanFactory)回调。
6.在第四步循环处理的是为子类型BeanDefinitionRegistryPostProcessor,因此会产生很多新的BeanPostProcessor这里统一处理有类型为BeanFactoryPostProcessor的
将所有类型为BeanPostProcessor的根据实现了1、ProrityOrdered接口的与实现2、Ordered接口的以及3、未实现排序接口的分为三组
然后排序依次执行
3.BeanPostProcessor相关接口在BeanFacotry中注册的顺序
1.在执行registerBeanPostProcessors(beanFactory);之前直接注册到BeanFactory中的顺序不变
2.BeanPostProcessorChecker紧随此前直接注册到BeanFacotry中BeanPostProcessor
3.实现了PriorityOrdered接口的BeanPostProcessor (根据getOrder()排序)
4.实现了Ordered接口的BeanPostProcessor(根据getOrder()排序)
5.未实现关于Order接口的普通BeanPostProcessor
6.所有类型为BeanPostProcessor的子类型的MergedBeanDefinitionPostProcessor重新注册,使它们的执行顺序在BeanPostProcessor直接类型的后面
7.ApplicationListenerDetector这个BeanPostProcessor放到最最后面
推荐文章
Spring解密 - Bean 加载流程
Spring Bean的生命周期(非常详细)