由于md文档部分语法不兼容,建议访问作者网站查阅文章:wlizhi.cc
spring源码系列文章,示例代码的中文注释,均是 copy 自 https://gitee.com/wlizhi/spring-framework 。
链接中源码是作者从 github 下载,并以自身理解对核心流程及主要节点做了详细的中文注释。
1 BeanFactoryPostProcessor
BeanFactoryPostProcessor中只有一个方法postProcessBeanFactory,实现了这个接口的类,会优先于其他常规的类实例化,并调用postProcessBeanFactory方法。
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
2 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口,同样的,它会优先与其他常规的类,提前实例化、加入到IOC容器,并会调用postProcessBeanDefinitionRegistry()方法,再调用postProcessBeanFactory()方法。
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
3 调用逻辑
- 首先搜集从BeanFactory中后去所有BeanDefinitionRegistryPostProcessor类型的beanName。
- 筛选出实现了PriorityOrdered接口的(
筛选过程中会调用getBean()方法
),并对其进行排序,然后进行遍历调用postProcessBeanDefinitionRegistry()。 - 筛选出实现了Ordered接口的,同上,进行getBean(),并排序,然后进行遍历调用postProcessBeanDefinitionRegistry()。
- 对没有实现PriorityOrdered接口且没有实现Ordered接口的BeanDefinitionRegistryPostProcessor进行排序、调用postProcessBeanDefinitionRegistry()。
- 上面的每一步调用postProcessBeanDefinitionRegistry()之前,会将其实力缓存到一个名为registryProcessors的List集合中,在以上步骤执行完,会调用BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()方法
- 对没有实现BeanDefinitionRegistryPostProcessor但实现了BeanFactoryPostProcessor的类进行搜集。
- 分别筛选出实现了PriorityOrdered接口、Ordered接口、没有实现接口的类,对其进行排序、getBean()操作,调用postProcessBeanFactory()方法。
从源码中,我们可以很清晰的看到执行流程。源码逻辑如下:
final class PostProcessorRegistrationDelegate {
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// 这里存储了已经调用过的BeanFactoryPostProcessor。
// BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口。
// 先调用BeanDefinitionRegistryPostProcessor的方法,然后是BeanFactoryPostProcessor
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// 这里面装的是实现了BeanFactoryPostProcessor接口的。
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
// 这里面装的是实现了BeanDefinitionRegistryPostProcessor接口的。
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 对参