前言
先来回顾一下我们上一篇文章学到的内容,上一篇文章完成了自动装配工作,就是把自定义的类以及框架必要的类加载到我们的beanFactory的BeanDefinitionMap当中,这些工作都是在核心源码invokeBeanFactoryPostProcessors方法中完成的,在开始下一个方法的解读之前,我们先来看看这个方法执行前后类中属性的变化:
方法执行前:

方法执行后:

经过invokeBeanFactoryPostProcessors方法执行前后的beanFactory的属性值BeanDefinitionMap的对比,我们可以很清晰的发现变化,方法执行前,我们的BeanDefinitionMap只包含了7个类,我们眼熟的只有启动类(启动类何时加载进来的,可以参照我的《SpringBoot源码系列(四)》),方法执行后会加载进来很多类。
RegisterBeanPostProcessors
现在回忆一下我们这个系列第一篇文章时画的“图1”,当时说到了两个重要接口,一个是beanFactoryPostProcessor,另一个是beanPostProcessor,beanFactoryPostProcessor在上一篇文章中已经讲到了,找到了3个beanFactoryPostProcessor类,然后执行他们的接口实现方法。
现在要讲解的这个方法,就是针对另一个另一个重要接口 -- beanPostProcessor来展开的,但是和前面的方法略有区别,就是这里只是加载到实现了beanPostProcessor的类,但是没有执行接口方法,我们在第一篇文章的“图1”可以看出,接口调用是在类的初始化前后分别执行的。
我们先看看这个方法执行前后beanFactory中的beanPostProcessors的值的变化:
执行前:

执行前beanPostProcessors包含了四个beanPostProcessor类,这四个类来源在《SpringBoot源码系列(五)》中已经提到,是在前面的三个方法中加载进来的。
执行后:

执行之后,beanPostprocessors包含了14个类,其中也包含了我们自定义的实现了BeanPostprocessor接口的类。
下面正式进入这个方法的学习:
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
/**
* 这个方法不展开讲
* 这个方法内部会调用doGetBeanNamesForType,然后方法内部会经过一些判断,判断是否实现了FactoryBean接口、是否是懒加载、是否单例等,经过层层判断,把符合的类装载到集合
* 我们在invokeBeanFactoryPostProcessor方法之后,BeanDefinitionMap加载到了类的信息,这里会遍历这个集合,从中找到实现了BeanPostProcessor接口的类,
* 我们自定义的类如果实现了BeanPostProcessor接口的话,这里也会被查找到 * /
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
//1 重新指定了BeanPostProcessors集合的长度
//2 向BeanPostProcessors添加了BeanPostProcessorChecker类 beanFactory.addBeanPostProcessor(new PostProcessorRegistrationDelegate.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList(); List<BeanPostProcessor> internalPostProcessors = new ArrayList(); List<String> orderedPostProcessorNames = new ArrayList(); List<String> nonOrderedPostProcessorNames = new ArrayList(); String[] var8 = postProcessorNames; int var9 = postProcessorNames.length; String ppName; BeanPostProcessor pp;
/**
* 这个循环把我们查到的BeanPostProcessor按照实现的接口分别装载到
* priorityOrderedPostProcessors、internalPostProcessors、orderedPostProcessorNames、nonOrderedPostProNames
* 下面的几个循环都是针对这几个集合来处理的,所以下面的代码看上去都是重复的
*/ for(int var10 = 0; var10 < var9; ++var10) { ppName = var8[var10]; if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } //排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//真正的写入BeanPostProcessors集合的方法 registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors); List<BeanPostProcessor> orderedPostProcessors = new ArrayList(); Iterator var14 = orderedPostProcessorNames.iterator(); while(var14.hasNext()) { String ppName = (String)var14.next(); BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors); List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList(); Iterator var17 = nonOrderedPostProcessorNames.iterator(); while(var17.hasNext()) { ppName = (String)var17.next(); pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors); sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, (List)internalPostProcessors); beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
总结
到这里我们一起来回忆一下《SpringBoot源码系列(一)》的那张图,框架读取类信息,加载成BeanDefinition、通过beanFactoryPostProcessors接口的扩展,通过反射完成实例化和初始化,初始化前后还会经过BeanPostProcessor接口的扩展,目前我们已经完成了BeanDefinition加载,BeanFactoryPostProcessor接口的包装,但是还没有完成实例化初始化,以及BeanPostProcessor接口的处理,我们接着看源码,registerBeanPostProcessors方法之后,接下来的两个方法是:initMessageSource、initApplicationEventMulticaster,这两个方法就是注册了两个类,我们先不关注这两个方法;onRefresh方法主要做的是tomcat的工作,也不是我们的重点,下篇文章我们将会直接进入核心代码 -- finishBeanFactoryInitialzatin方法的学习。
浙公网安备 33010602011771号