/** * Register the given bean definition with the given bean factory. * 注册BeanDefinition * * @param definitionHolder the bean definition including name and aliases * @param registry the bean factory to register with * @throws BeanDefinitionStoreException if registration failed */ publicstaticvoidregisterBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException {
/** * Reset all bean definition caches for the given bean, * including the caches of beans that are derived from it. * <p>Called after an existing bean definition has been replaced or removed, * triggering {@link #clearMergedBeanDefinition}, {@link #destroySingleton} * and {@link MergedBeanDefinitionPostProcessor#resetBeanDefinition} on the * given bean and on all bean definitions that have the given bean as parent. * 重置给定bean的所有bean定义缓存 * * @param beanName the name of the bean to reset * @see #registerBeanDefinition * @see #removeBeanDefinition */ protectedvoidresetBeanDefinition(String beanName) { // Remove the merged bean definition for the given bean, if already created. // 1.删除beanName的mergedBeanDefinitions缓存(如果有的话) clearMergedBeanDefinition(beanName);
// Remove corresponding bean from singleton cache, if any. Shouldn't usually // be necessary, rather just meant for overriding a context's default beans // (e.g. the default StaticMessageSource in a StaticApplicationContext). // 2.从单例缓存中删除该beanName对应的bean(如果有的话) destroySingleton(beanName);
// Notify all post-processors that the specified bean definition has been reset. for (BeanPostProcessor processor : getBeanPostProcessors()) { if (processor instanceof MergedBeanDefinitionPostProcessor) { ((MergedBeanDefinitionPostProcessor) processor).resetBeanDefinition(beanName); } }
// Reset all bean definitions that have the given bean as parent (recursively). // 3.重置beanName的所有子Bean定义(递归) for (String bdName : this.beanDefinitionNames) { if (!beanName.equals(bdName)) { BeanDefinitionbd=this.beanDefinitionMap.get(bdName); // Ensure bd is non-null due to potential concurrent modification // of the beanDefinitionMap. // 当前遍历的BeanDefinition的parentName为beanName,则递归调用resetBeanDefinition进行重置 if (bd != null && beanName.equals(bd.getParentName())) { resetBeanDefinition(bdName); } } } }
@Override publicvoidregisterAlias(String name, String alias) { Assert.hasText(name, "'name' must not be empty"); Assert.hasText(alias, "'alias' must not be empty"); // 1.如果别名和beanName相同,则不算别名,从aliasMap缓存中移除 synchronized (this.aliasMap) { if (alias.equals(name)) { this.aliasMap.remove(alias); if (logger.isDebugEnabled()) { logger.debug("Alias definition '" + alias + "' ignored since it points to same name"); } } else { StringregisteredName=this.aliasMap.get(alias); if (registeredName != null) { if (registeredName.equals(name)) { // An existing alias - no need to re-register // 2.如果别名已经注册过,直接返回 return; } // 3.如果存在相同的别名,并且不允许别名覆盖,则抛出异常 if (!allowAliasOverriding()) { thrownewIllegalStateException("Cannot define alias '" + alias + "' for name '" + name + "': It is already registered for name '" + registeredName + "'."); } if (logger.isDebugEnabled()) { logger.debug("Overriding alias '" + alias + "' definition for registered name '" + registeredName + "' with new target name '" + name + "'"); } } // 4.检查name和alias是否存在循环引用。例如A的别名为B,B的别名为A checkForAliasCircle(name, alias); // 5.将别名和beanName的映射放到aliasMap缓存中 this.aliasMap.put(alias, name); if (logger.isTraceEnabled()) { logger.trace("Alias definition '" + alias + "' registered for name '" + name + "'"); } } } }
总结
我们可以重新梳理一下思路,我们首先将 xml 中的 bean 配置信息进行了解析,并构建了 AbstractBeanDefinition(GenericBeanDefinition) 对象来存放所有解析出来的属性。