在介绍了 obtainFreshBeanFactory、invokeBeanFactoryPostProcessors、registerBeanPostProcessors 三个重要方法后,我们终于来到了最后一个重要方法:finishBeanFactoryInitialization。finishBeanFactoryInitialization 是这四个方法中最复杂也是最重要的,是整个 Spring IoC 核心中的核心。
// Iterate over a copy to allow for init methods which in turn register new bean definitions. // While this may not be part of the regular factory bootstrap, it does otherwise work fine. //xml解析时,讲过,把所有beanName都缓存到beanDefinitionNames了 //1. 创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义 List<String> beanNames = newArrayList<>(this.beanDefinitionNames);
//检查containingBd是否为空 一般是为空的 // Check with full lock now in order to enforce the same merged instance. if (containingBd == null) { //2. 检查beanName对应的MergedBeanDefinition是否存在于缓存中 //从mergedBeanDefinitions容器中根据beanName获取BeanDefinition mbd = this.mergedBeanDefinitions.get(beanName); } //3. 如果beanName对应的MergedBeanDefinition不存在于缓存中 if (mbd == null || mbd.stale) { previous = mbd; //4.如果bd的parentName为空,代表bd没有父定义,无需与父定义进行合并操作 //也就是bd的MergedBeanDefinition就是bd本身(可能需要转成RootBeanDefinition) if (bd.getParentName() == null) { //4.1 如果bd的类型为RootBeanDefinition,则bd的MergedBeanDefinition就是bd本身,则直接克隆一个副本 // Use copy of given root bean definition. if (bd instanceof RootBeanDefinition) { mbd = ((RootBeanDefinition) bd).cloneBeanDefinition(); } else { // 4.2 否则,将bd作为参数,构建一个RootBeanDefinition。 // 正常使用下,BeanDefinition在被加载后是GenericBeanDefinition或ScannedGenericBeanDefinition mbd = newRootBeanDefinition(bd); } } else { // 5.否则,bd存在父定义,需要与父定义合并 // Child bean definition: needs to be merged with parent. BeanDefinition pbd; try { //5.1 获取父定义的beanName StringparentBeanName= transformedBeanName(bd.getParentName()); //5.2 如果父定义的beanName与该bean的beanName不同 if (!beanName.equals(parentBeanName)) { //5.3 获取父定义的MergedBeanDefinition(因为父定义也可能有父定义,也就是bd的爷爷定义...) pbd = getMergedBeanDefinition(parentBeanName); } else { //5.4 如果父定义的beanName与bd的beanName相同,则拿到父BeanFactory, // 只有在存在父BeanFactory的情况下,才允许父定义beanName与自己相同,否则就是将自己设置为父定义 BeanFactoryparent= getParentBeanFactory(); // 5.5 如果父BeanFactory是ConfigurableBeanFactory,则通过父BeanFactory获取父定义的MergedBeanDefinition if (parent instanceof ConfigurableBeanFactory) { pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName); } else { // 5.6 如果父BeanFactory不是ConfigurableBeanFactory,则抛异 thrownewNoSuchBeanDefinitionException(parentBeanName, "Parent name '" + parentBeanName + "' is equal to bean name '" + beanName + "': cannot be resolved without an AbstractBeanFactory parent"); } } } catch (NoSuchBeanDefinitionException ex) { thrownewBeanDefinitionStoreException(bd.getResourceDescription(), beanName, "Could not resolve parent bean definition '" + bd.getParentName() + "'", ex); } // Deep copy with overridden values. // 5.7 使用父定义pbd构建一个新的RootBeanDefinition对象(深拷贝) mbd = newRootBeanDefinition(pbd); //5.8 使用bd覆盖父定义,进行父类的BeanDefinition的重写 mbd.overrideFrom(bd); }
// 6.如果没有配置scope,则设置成默认的singleton // Set default singleton scope, if not configured before. if (!StringUtils.hasLength(mbd.getScope())) { mbd.setScope(SCOPE_SINGLETON); }
// A bean contained in a non-singleton bean cannot be a singleton itself. // Let's correct this on the fly here, since this might be the result of // parent-child merging for the outer bean, in which case the original inner bean // definition will not have inherited the merged outer bean's singleton status. // 7.如果containingBd不为空 && containingBd不为singleton && mbd为singleton,则将mdb的scope设置为containingBd的scope if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) { mbd.setScope(containingBd.getScope()); }
//8.将beanName与mbd放到mergedBeanDefinitions缓存,以便之后可以直接使用 // Cache the merged bean definition for the time being // (it might still get re-merged later on in order to pick up metadata changes) if (containingBd == null && isCacheBeanMetadata()) { this.mergedBeanDefinitions.put(beanName, mbd); } } if (previous != null) { copyRelevantMergedBeanDefinitionCaches(previous, mbd); } // 9.返回MergedBeanDefinition return mbd; } }