03 BeanFactoryPostProcessor的注册与执行

由于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 调用逻辑

  1. 首先搜集从BeanFactory中后去所有BeanDefinitionRegistryPostProcessor类型的beanName。
  2. 筛选出实现了PriorityOrdered接口的(筛选过程中会调用getBean()方法),并对其进行排序,然后进行遍历调用postProcessBeanDefinitionRegistry()。
  3. 筛选出实现了Ordered接口的,同上,进行getBean(),并排序,然后进行遍历调用postProcessBeanDefinitionRegistry()。
  4. 对没有实现PriorityOrdered接口且没有实现Ordered接口的BeanDefinitionRegistryPostProcessor进行排序、调用postProcessBeanDefinitionRegistry()。
  5. 上面的每一步调用postProcessBeanDefinitionRegistry()之前,会将其实力缓存到一个名为registryProcessors的List集合中,在以上步骤执行完,会调用BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()方法
  6. 对没有实现BeanDefinitionRegistryPostProcessor但实现了BeanFactoryPostProcessor的类进行搜集。
  7. 分别筛选出实现了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<>();

			// 对参
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值