spring源码:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的区别

这篇文章主要记录下BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的学习和一些见解;

结论

我习惯先说结论,然后再细说具体的源码:

  1. 前者是后者的父接口,后者是前者的子接口
  2. 两者都是在bean实例化之前对beanDefinition进行的一系列操作
  3. spring源码中,先执行后者的实现类,再实现前者的实现类

在spring源码中,这两个接口的实现类完成了bean的扫描和对配置类生成了代理对象
我们以 ***ConfigurationClassPostProcessor***这个类为例,来学习这两个接口;
说到这个类,我们要说的源码是这个方法:
org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors

源码分析

在源码中,BeanFactoryPostProcessor的接口中定义的方法是void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
BeanDefinitionRegistryPostProcessor定义的方法是void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; 这两个接口都是spring提供的扩展点,执行时机是在bean实例化之前;

我们在前面的源码解析中 spring源码-bean加载整体流程 文章中有提到过,在spring初始化的源码中,需要特别注意一下ConfigurationClassPostProcessor这个类,因为这个类在spring自动扫描bean起到了非常大的作用

invokeBeanFactoryPostProcessors(beanFactory);方法会调用到下面的这个方法,这个方法就是本篇的核心

/**
 * @param beanFactory
 * @param beanFactoryPostProcessors
 *
 * 这里是对beanDefinitionRegistryPostProcessor和beanFactoryPostProcessor实现类的出来
 * 1.先执行程序员通过API提供的beanDefinitionRegistryPostProcessor的实现类
 * 2.执行spring中,实现了PriorityOrdered接口且实现了beanDefinitionRegistryPostProcessor接口的实现类
 * 3.执行spring中,实现了Ordered接口且实现了beanDefinitionRegistryPostProcessor接口的实现类
 * 4.执行spring中,只实现了beanDefinitionRegistryPostProcessor接口的实现类
 * 5.执行实现了beanFactoryPostProcessor接口的实现类
 */
public static void invokeBeanFactoryPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
   

	// Invoke BeanDefinitionRegistryPostProcessors first, if any.
	//这个set集合可以理解为存储的是已经执行过的beanDefinitionRegistryPostProcessor
	Set<String> processedBeans = new HashSet<>();

	/**
	 * 这里之所以要判断beanFactory是哪种类型的,应该和org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry)
	 * 的入参有关系
	 */
	if (beanFactory instanceof BeanDefinitionRegistry) {
   
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		//regularPostProcessors这个list存储的是beanFactoryPostProcessor接口的实现类
		List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
		//registryProcessors 这个list存储的是beanDefinitionRegistryPostProcessor接口的实现类
		List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

		/**
		 * 序号1
		 * 这里的beanFactoryPostProcessors是程序员自己提供的BeanFactoryPostProcessor的实现类
		 */
		for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
   
			/**
			 * 区分当前bean是BeanDefinitionRegistryPostProcessor还是 beanFactoryPostProcessor
			 * 因为前者是后者的子类,所以在获取beanFactoryPostprocessor的时候 也可以获取到
			 *
			 * 在本方法中  是先执行实现了BeanDefinitionRegistryPostProcessor的类
			 * 再执行beanFactoryPostProcessor的类
			 * 序号1.1
			 */
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
   
				BeanDefinitionRegistryPostProcessor registryProcessor =
						(BeanDefinitionRegistryPostProcessor) postProcessor;
				//这里直接执行程序员通过API注入的beanDefinitionRegistryPostProcessor的实现类
				registryProcessor.postProcessBeanDefinitionRegistry(registry);
				registryProcessors.add(registryProcessor);
			}
			else<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值