Spring源码之启动过程(二)—— invokeBeanFactoryPostProcessors()方法解析

        Spring在启动的时候,在实例化之前在AbstractApplicationContext.refresh()中会执行invokeBeanFactoryPostProcessors()。

        在前面的BeanFactory准备好之后,执行该方法,负责激活各种 BeanFactory 处理器,以及两个核心接口BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口的调用:        

  • BeanDefinitionRegistryPostProcessor
  • BeanFactoryPostProcessor
  • ConfigurationClassPostProcessor

        它会往AbstractBeanFactory中的beanPostProcessors属性(一个List)中放置各种类型的BeanPostProcessor对象。

BeanFactoryPostProcessor是BeanFactory的后置处理器

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		// 在这里拿到了ConfigurationClassPostProcessor的实例,然后调用beanFactory.getBean()方法
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
		// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

        getBeanFactoryPostProcessors()方法获取的是我们手动添加进去的BeanFactoryPostProcessor,例如:

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ScanBean.class);
applicationContext.addBeanFactoryPostProcessor(new KieasarBeanFactoryPostProcessor());

         接下来,进入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors():

// 参数beanFactory就是之前创建好的BeanFactory
	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		Set<String> processedBeans = new HashSet<>();

		// 处理实现BeanDefinitionRegistry接口的情况
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			// beanFactoryPostProcessors一般情况下是空的,除非手动调用容器的addBeanFactoryPostProcessor()方法添加
			// beanFactoryPostProcessors包含了普通的BeanFactoryPostProcessor对象和BeanDefinitionRegistryPostProcessor对象
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				// 如果是BeanDefinitionRegistryPostProcessor对象,会强制转换,并执行postProcessBeanDefinitionRegistry()方法
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}
			}

			// Do not initialize FactoryBeans here: We need to leave all regular beans
			// uninitialized to let the bean factory post-processors apply to them!
			// Separate between BeanDefinitionRegistryPostProcessors that implement
			// PriorityOrdered, Ordered, and the rest.
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// 执行扫描处理的BeanDefinitionRegistryPostProcessor:

			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
			// 获取实现了BeanDefinitionRegistryPostProcessor接口的所有类的BeanDefinition对象的beanName
			// 1.最先调用的是实现了PriorityOrdered接口的所有BeanDefinitionRegistryPostProcessor中的postProcessBeanDefinitionRegistry()方法
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				// 判断是否实现了排序接口PriorityOrdered
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					// 通过上面拿到BeanDefinitionRegistryPostProcessor类型的name获取实例,调用beanFactory.getBean()方法
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			// 升序排序,就是用List中的sort排序,通过Comparator来进行
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			// 之前只有一个实例,基于注解的扫描是由@ComponentScan触发的,这个注解的解析是ConfigurationClassPostProcessor做的,有了ConfigurationClassPostProcessor才有后续类的收集、注册(先执行);
			// 但基于xml配置的自定义标签是先扫描的,把所有注解的类变成BeanDefinition,然后再注册组件,再执行ConfigurationClassPostProcessor类(后执行)。
			// 调用之后,拿到ConfigurationClassPostProcessor实例后在这里调用BeanDefinitionRegistryPostProcessor类的postProcessBeanDefinitionRegistry(registry);
			// 会注册进来多个实例
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
			// 2.在getBeanNamesForType()方法中拿到被ConfigurationClassPostProcessor获取到的多个BeanDefinitionRegistryPostProcessor实例
			// 然后调用实现了Ordered接口的所有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);
			// 调用过程,拿到实例后在这里调用BeanDefinitionRegistryPostProcessor接口实现类的postProcessBeanDefinitionRegistry(registry);
			// 会注册进来多个实例
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			// 3.最后调用的是没实现排序接口的、所有实现BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry的方法
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					// 忽略之前执行过的PostProcessor
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}

			// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
			// 执行完BeanDefinitionRegistryPostprocessor的postProcessBeanDefinitionRegistry()方法后,再执行BeanDefinitionRegistryPostprocessor的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

			// 执行手动添加的普通BeanFactoryPostProcessor的postProcessBeanFactory()方法
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		// 执行扫描出来的普通BeanFactoryPostProcessor

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		// 进行分类
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		beanFactory.clearMetadataCache();
	}

       进入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法:

       1. 调用BeanDefinitionRegistryPostProcessor接口的执行是在实例化之前,可以完成BeanDefinition的注册和修改:

  • 实现PriorityOrdered接口;
  • 实现Ordered接口;
  • 实际是对其实现类中postProcessBeanDefinitionRegistry()方法的调用,完成对BeanDefinition的新增、修改。
private static void invokeBeanDefinitionRegistryPostProcessors(
      Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {

   for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
      // 实际是对其实现类中postProcessBeanDefinitionRegistry()方法的调用,完成对BeanDefinition的新增、修改;
      postProcessor.postProcessBeanDefinitionRegistry(registry);
   }
}

        主要是对其实现类中postProcessBeanDefinitionRegistry()方法的调用,完成对BeanDefinition的新增、修改。 

      2. 调用BeanFactoryPostProcessor接口:

  • 实现PriorityOrdered接口;
  • 实现Ordered接口;
  • 两个接口都没实现;
  • 实际完成了对其实现类中postProcessBeanFactory方法的调用。
private static void invokeBeanFactoryPostProcessors(
      Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

   for (BeanFactoryPostProcessor postProcessor : postProcessors) {
      // 调用它的postProcessBeanFactory方法
      postProcessor.postProcessBeanFactory(beanFactory);
   }
}

        执行对其实现类中postProcessBeanFactory()方法的调用。

        对上面代码的理解:获取 BeanDefinitionRegistry 对象,获取到这个对象就可以获取这个对象中注册的所有 BeanDefinition 对象,拥有了这个对象就可以对里面所有 BeanDefinition 对象的修改和新增操作。

        调用所有实现了BeanDefinitionRegistryPostProcessor接口中的两个方法,执行过程完成。

        总结一下,invokeBeanFactoryPostProcessors()方法执行逻辑:

        1. 执行通过ApplicationContext添加进来的BeanDefinitionRegistryPostProcessor的
postProcessBeanDefinitionRegistry()方法;
        2. 执行BeanFactory中实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的
postProcessBeanDefinitionRegistry()方法;
        3. 执行BeanFactory中实现了Ordered接口的BeanDefinitionRegistryPostProcessor的
postProcessBeanDefinitionRegistry()方法;
        4. 执行BeanFactory中其他的BeanDefinitionRegistryPostProcessor的
postProcessBeanDefinitionRegistry()方法;
        5. 执行上面所有的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法;
        6. 执行通过ApplicationContext添加进来的BeanFactoryPostProcessor的
postProcessBeanFactory()方法;
        7. 执行BeanFactory中实现了PriorityOrdered接口的BeanFactoryPostProcessor的
postProcessBeanFactory()方法;
        8. 执行BeanFactory中实现了Ordered接口的BeanFactoryPostProcessor的
postProcessBeanFactory()方法;
        9. 执行BeanFactory中其他的BeanFactoryPostProcessor的postProcessBeanFactory()方法。

        BeanDefinitionRegistryPostProcessor接口应用:

/**
 * @Classname BeanPro
 * @Description BeanDefinitionRegistryPostProcessor接口案例
 * @Author Kieasar
 * Date 2021/5/13 20:17
 * Version 1.0
 */
@Component
public class BeanPro implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, Ordered {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        //查询BeanDefinition
        final String[] beanDefinitionNames = registry.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitionName);
            System.out.println(beanDefinition);
        }
        // 新建一个beanDefinition
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(BeanDefinitionBean.class);
        MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
        // 将BeanDefinitionBean中name之前的test修改为Kieasar
        propertyValues.add("name", "Kieasar");
        // 然后注册到Spring容器中
        registry.registerBeanDefinition("beanDefinitionBean", genericBeanDefinition);

        // 新建一个扫描器
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);
        //需要过滤的注解
        scanner.addIncludeFilter(new AnnotationTypeFilter(MyService.class));
        // 指定扫描的包
        scanner.scan("com.enjoy.Kieasar.customBean");

    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();

        DefaultListableBeanFactory beanFactory1 = (DefaultListableBeanFactory) beanFactory;
        // 是否允许BeanDefinition名称重复
        beanFactory1.setAllowBeanDefinitionOverriding(true);
        // 是否允许循环依赖
        beanFactory1.setAllowCircularReferences(true);
        // 是否允许未经包装的注入报错(多重循环依赖报错、多重切面存在循环依赖的报错)
        beanFactory1.setAllowRawInjectionDespiteWrapping(true);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值