1. spring中的两大回调接口
org.springframework.beans.factory.config.BeanFactoryPostProcessor
关于对象工厂BeanFactory创建完毕的回调处理
org.springframework.beans.factory.config.BeanPostProcessor
关于通过对象工厂BeanFactory创建对象前后的回调处理
2. 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放到最最后面
后面查看BeanFacotry相关的源码时再总结各个接口的回调顺序