beanDefinition注册源码分析
一、功能
将bean 配置元信息beanDefinition注册到beanFactory容器中
二、程序入口
DefaultListableBeanFactory#registerBeanDefinition
三、源码分析
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable{ /** * 注册BeanDefinition * @param beanName Bean名称 * @param beanDefinition 解析或者构建BeanDefinition */ @Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { //基础参数校验 Assert.hasText(beanName, "Bean name must not be empty"); Assert.notNull(beanDefinition, "BeanDefinition must not be null"); //bean进行了方法重写 注册的时候需要进一步校验 if (beanDefinition instanceof AbstractBeanDefinition) { try { ((AbstractBeanDefinition) beanDefinition).validate(); } catch (BeanDefinitionValidationException ex) { throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Validation of bean definition failed", ex); } } /** * this.beanDefinitionMap:ConcurrentHashMap类型,保存了该BeanFactory的所有注册的BeanDefinition * 尝试在beanDefinitionMap中获取已经注册的BeanDefinition */ BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName); if (existingDefinition != null) { //判断是否允许覆盖,默认允许 if (!isAllowBeanDefinitionOverriding()) { //如果Spring配置了不允许BeanDefinition覆盖,已经注册过,现在该beanName又尝试注册就抛出BeanDefinitionOverrideException throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition); } else if (existingDefinition.getRole() < beanDefinition.getRole()) { /** * BeanDefinition.role是Spring提供给用户自定义的字段 * 此处判断如果新覆盖的BeanDefinition角色>旧的BeanDefinition角色就输出一段info级别的日志 */ if (logger.isInfoEnabled()) { logger.info("Overriding user-defined bean definition for bean '" + beanName + "' with a framework-generated bean definition: replacing [" + existingDefinition + "] with [" + beanDefinition + "]"); } } else if (!beanDefinition.equals(existingDefinition)) { //如果新覆盖的BeanDefinition与旧的BeanDefinition不相同就输出一段debug级别的日志 if (logger.isDebugEnabled()) { logger.debug("Overriding bean definition for bean '" + beanName + "' with a different definition: replacing [" + existingDefinition + "] with [" + beanDefinition + "]"); } } else { //输出一段该beanName被覆盖的trace级别日志 if (logger.isTraceEnabled()) { logger.trace("Overriding bean definition for bean '" + beanName + "' with an equivalent definition: replacing [" + existingDefinition + "] with [" + beanDefinition + "]"); } } //进行覆盖 this.beanDefinitionMap.put(beanName, beanDefinition); } else { //如果在beanDefinitionMap找不到 if (hasBeanCreationStarted()) { //有其他bean已经开始了注册,需要加锁,保证数据一致性 synchronized (this.beanDefinitionMap) { /** * beanDefinitionMap:beanName作为key BeanDefinition作为value * beanDefinitionNames:保存所有注册的bean名称,排序使用 */ this.beanDefinitionMap.put(beanName, beanDefinition); List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1); updatedDefinitions.addAll(this.beanDefinitionNames); updatedDefinitions.add(beanName); this.beanDefinitionNames = updatedDefinitions; /** * removeManualSingletonName的作用就是: * 如果有单体对象(依赖来源的一种)跟这个BeanDefinition名称相同则在manualSingletonNames中remove掉这个单体对象 * 因为BeanDefinition和单体对象都是依赖来源,都可以通过beanName找到Bean,因此BeanDefinition和单体对象不能存在beanName相同的情况 */ removeManualSingletonName(beanName); } } else { // Still in startup registration phase this.beanDefinitionMap.put(beanName, beanDefinition); this.beanDefinitionNames.add(beanName); removeManualSingletonName(beanName); } this.frozenBeanDefinitionNames = null; } if (existingDefinition != null || containsSingleton(beanName)) { /** * 如果该BeanDefinition注册过,则在mergedBeanDefinitions中会有缓存 * 如果该beanName曾经是单体对象,上面只是remove manualSingletonNames,还需要清空singletonObjects等等,singletonObjects是Spring单例Bean的三层缓存中第一层,三层缓存可以解决循环依赖问题 * resetBeanDefinition就是负责清空这些 */ resetBeanDefinition(beanName); } } }

浙公网安备 33010602011771号