spring refresh()方法详解4之invokeBeanFactoryPostProcessors(beanFactory)

	/**
	 * 本方法会实例化和调用所有 BeanFactoryPostProcessor(包括其子类 BeanDefinitionRegistryPostProcessor)
	 * BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许
	 * BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。
	 * 
	 * BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,
	 * 	比 BeanFactoryPostProcessor 具有更高的优先级,
	 * 	主要用来在常规的 BeanFactoryPostProcessor 检测开始之前注册其他 bean 定义。
	 * 	特别是,你可以通过 BeanDefinitionRegistryPostProcessor 来注册一些常规的 BeanFactoryPostProcessor,
	 * 	因为此时所有常规的 BeanFactoryPostProcessor 都还没开始被处理。 
	 */
	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	    // 1.getBeanFactoryPostProcessors(): 拿到当前应用上下文beanFactoryPostProcessors变量中的值
	    // 2.invokeBeanFactoryPostProcessors: 实例化并调用所有已注册的BeanFactoryPostProcessor
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

1.getBeanFactoryPostProcessors

	/**
	 * 这边 getBeanFactoryPostProcessors() 会拿到当前应用上下文中已经注册的 BeanFactoryPostProcessor,
	 * 在默认情况下,this.beanFactoryPostProcessors 是返回空的
	 */
	public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
		return this.beanFactoryPostProcessors;
	}

2.invokeBeanFactoryPostProcessors

	/**
	 * 实例化并调用所有已注册的 BeanFactoryPostProcessor
	 * 	1.先查看入参beanFactoryPostProcessors中的
	 * 	2.查看所有已注册bean定义的BeanDefinitionRegistryPostProcessor
	 * 		2.1.实现PriorityOrdered接口的  排序后按顺序执行postProcessBeanDefinitionRegistry方法
	 * 		2.2.实现Ordered接口并且还未执行的  排序后按顺序执行postProcessBeanDefinitionRegistry方法
	 * 		2.3.剩余的BeanDefinitionRegistryPostProcessor 执行其postProcessBeanDefinitionRegistry方法
	 * 	3.按上面执行循序调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
	 * 	4.调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
	 * 
	 * 	重复调用BeanDefinitionRegistryPostProcessor的步骤处理BeanFactoryPostProcessor
	 * 
	 * 优先级:
	 * 	1:BeanDefinitionRegistryPostProcessor  >  BeanFactoryPostProcessor
	 * 	2:入参beanFactoryPostProcessors > 实现PriorityOrdered接口  > 实现Ordered接口 > 其他
	 */
	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		Set<String> processedBeans = new HashSet<>();
	    // 1.判断beanFactory是否为BeanDefinitionRegistry,beanFactory为DefaultListableBeanFactory,
	    // 而DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,因此这边为true
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			// 用于存放普通的BeanFactoryPostProcessor
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
	        // 用于存放BeanDefinitionRegistryPostProcessor
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

	        // 2.首先处理入参中的beanFactoryPostProcessors
	        // 遍历所有的beanFactoryPostProcessors, 将BeanDefinitionRegistryPostProcessor和普通BeanFactoryPostProcessor区分开
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                // 2.1 如果是BeanDefinitionRegistryPostProcessor
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
	                // 2.1.1 直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
	                // 2.1.2 添加到registryProcessors(用于最后执行postProcessBeanFactory方法)
					registryProcessors.add(registryProcessor);
				}
				else {
	                // 2.2 否则,只是普通的BeanFactoryPostProcessor
					// 2.2.1 添加到regularPostProcessors(用于最后执行postProcessBeanFactory方法)
					regularPostProcessors.add(postProcessor);
				}
			}
			
	        // 用于保存本次要执行的BeanDefinitionRegistryPostProcessor
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

	        // 3.调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类
	        // 3.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的Bean的beanName
	        String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	        // 3.2 遍历postProcessorNames
			for (String ppName : postProcessorNames) {
	            // 3.3 校验是否实现了PriorityOrdered接口
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
	                // 3.4 获取ppName对应的bean实例, 添加到currentRegistryProcessors中,
	                // beanFactory.getBean: 这边getBean方法会触发创建ppName对应的bean对象, 目前暂不深入解析
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
	                // 3.5 将要被执行的加入processedBeans,避免后续重复执行
					processedBeans.add(ppName);
				}
			}
	        // 3.6 进行排序(根据是否实现PriorityOrdered、Ordered接口和order值来排序)
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			// 3.7 添加到registryProcessors(用于最后执行postProcessBeanFactory方法)
			registryProcessors.addAll(currentRegistryProcessors);
	        // 3.8 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
	        // 3.9 执行完毕后, 清空currentRegistryProcessors
	        currentRegistryProcessors.clear();

	        // 4.调用所有实现了Ordered接口的BeanDefinitionRegistryPostProcessor实现类(过程跟上面的步骤3基本一样)
	        // 4.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的类, 这边重复查找是因为执行完上面的BeanDefinitionRegistryPostProcessor,
	        // 可能会新增了其他的BeanDefinitionRegistryPostProcessor, 因此需要重新查找
	        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
	            // 校验是否实现了Ordered接口,并且还未执行过
	            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
	        // 4.2 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法
	        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

	        // 5.最后, 调用所有剩下的BeanDefinitionRegistryPostProcessors
	        boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
	            // 5.1 找出所有实现BeanDefinitionRegistryPostProcessor接口的类
	            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
	                // 5.2 跳过已经执行过的
	                if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
	                    // 5.3 如果有BeanDefinitionRegistryPostProcessor被执行, 则有可能会产生新的BeanDefinitionRegistryPostProcessor,
	                    // 因此这边将reiterate赋值为true, 代表需要再循环查找一次
	                    reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
	            // 5.4 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法
	            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}

			// 6.调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法(BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor)
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
	        // 7.最后, 调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
	        invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}
		else {
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

	    // 到这里 , 入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,
	    // 下面开始处理容器中的所有BeanFactoryPostProcessor
		// 8.找出所有实现BeanFactoryPostProcessor接口的类
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

	    // 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
	    // 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName
	    List<String> orderedPostProcessorNames = new ArrayList<>();
	    // 用于存放普通BeanFactoryPostProcessor的beanName
	    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
	    // 8.1 遍历postProcessorNames, 将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开
	    for (String ppName : postProcessorNames) {
	        // 8.2 跳过已经执行过的
	    	if (processedBeans.contains(ppName)) {
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
	            // 8.3 添加实现了PriorityOrdered接口的BeanFactoryPostProcessor
	            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
	            // 8.4 添加实现了Ordered接口的BeanFactoryPostProcessor的beanName
	            orderedPostProcessorNames.add(ppName);
			}
			else {
	            // 8.5 添加剩下的普通BeanFactoryPostProcessor的beanName
	            nonOrderedPostProcessorNames.add(ppName);
			}
		}

	    // 9.调用所有实现PriorityOrdered接口的BeanFactoryPostProcessor
	    // 9.1 对priorityOrderedPostProcessors排序
	    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	    // 9.2 遍历priorityOrderedPostProcessors, 执行postProcessBeanFactory方法
	    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

	    // 10.调用所有实现Ordered接口的BeanFactoryPostProcessor
	    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
	        // 10.1 获取postProcessorName对应的bean实例, 添加到orderedPostProcessors, 准备执行
	        orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
	    // 10.2 对orderedPostProcessors排序
	    sortPostProcessors(orderedPostProcessors, beanFactory);
	    // 10.3 遍历orderedPostProcessors, 执行postProcessBeanFactory方法
	    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

	    // 11.调用所有剩下的BeanFactoryPostProcessor
	    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
	        // 11.1 获取postProcessorName对应的bean实例, 添加到nonOrderedPostProcessors, 准备执行
	        nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
	    // 11.2 遍历nonOrderedPostProcessors, 执行postProcessBeanFactory方法
	    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

	    // 12.清除元数据缓存(mergedBeanDefinitions、allBeanNamesByType、singletonBeanNamesByType),
	    // 因为后处理器可能已经修改了原始元数据,例如, 替换值中的占位符...
		beanFactory.clearMetadataCache();
	}

其他

	private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
		Comparator<Object> comparatorToUse = null;
		if (beanFactory instanceof DefaultListableBeanFactory) {
	        // 1.获取设置的比较器
	        comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
		}
		if (comparatorToUse == null) {
	        // 2.如果没有设置比较器, 则使用默认的OrderComparator
	        comparatorToUse = OrderComparator.INSTANCE;
		}
	    // 3.使用比较器对postProcessors进行排序
	    postProcessors.sort(comparatorToUse);
	}

	/**
	 * 遍历  执行postProcessBeanDefinitionRegistry方法
	 */
	private static void invokeBeanDefinitionRegistryPostProcessors(
			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {

		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
	}

3.使用举例

@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, Ordered {
 
	/**
	 * 定义一个类实现BeanDefinitionRegistryPostProcessor接口  优先级高的重写下面两个方法,这里可以写我们自己的处理
	 * 	这里只是打印了两句话
	 * 注:这个bean需要配置到spring容器中
	 */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("1.=======插手beanFactory的生命周期  高优先级的BeanDefinitionRegistryPostProcessor" );
    }
 
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    	System.out.println("2.=======插手beanFactory的生命周期  高优先级的BeanDefinitionRegistryPostProcessor" );
    }
    @Override
    public int getOrder() {
        return 0;
    }
}
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, Ordered {
 
	/**
	 * 定义一个类实现BeanDefinitionRegistryPostProcessor接口  优先级高的重写下面两个方法,这里可以写我们自己的处理
	 * 	这里只是打印了两句话
	 * 注:这个bean需要配置到spring容器中
	 */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("1.=======插手beanFactory的生命周期  高优先级的BeanDefinitionRegistryPostProcessor" );
    }
 
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    	System.out.println("2.=======插手beanFactory的生命周期  高优先级的BeanDefinitionRegistryPostProcessor" );
    }
    @Override
    public int getOrder() {
        return 0;
    }
}

然后我们启动一下容器

	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
	}

输出如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`refresh()` 是 Spring 框架中的一个方法,它用于刷新应用程序上下文(ApplicationContext)以更新其内部状态。在 Spring 框架中,`refresh()` 方法是非常重要的,因为它负责完成应用程序上下文的初始化和配置,并准备好所有的单例 bean 以供使用。 下面是 `refresh()` 方法的主要流程: 1. 准备刷新过程中需要用到的变量和标志位; 2. 调用 `prepareRefresh()` 方法,进行一些预处理工作; 3. 调用 `obtainFreshBeanFactory()` 方法,创建 BeanFactory 并进行一些初始化工作; 4. 调用 `prepareBeanFactory(beanFactory)` 方法,对 BeanFactory 进行一些后续处理; 5. 调用 `postProcessBeanFactory(beanFactory)` 方法,对 BeanFactory 进行后置处理; 6. 调用 `invokeBeanFactoryPostProcessors(beanFactory)` 方法,执行 BeanFactoryPostProcessorpostProcessBeanFactory() 方法; 7. 调用 `registerBeanPostProcessors(beanFactory)` 方法,注册 BeanPostProcessor 实例; 8. 调用 `initMessageSource()` 方法,初始化 MessageSource 组件; 9. 调用 `initApplicationEventMulticaster()` 方法,初始化 ApplicationEventMulticaster 组件; 10. 调用 `onRefresh()` 方法,进行一些自定义的刷新工作; 11. 调用 `registerListeners()` 方法,注册事件监听器; 12. 调用 `finishBeanFactoryInitialization(beanFactory)` 方法,完成所有非延迟初始化的单例 bean 的初始化工作; 13. 调用 `finishRefresh()` 方法,完成上下文的刷新工作。 需要注意的是,`refresh()` 方法在执行过程中会涉及到很多细节,比如如何处理环境变量、如何处理自定义的 bean 定义、如何处理多个上下文之间的关系等等。如果需要深入了解 `refresh()` 方法的实现细节,可以查看 Spring 框架的源代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值