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);
        }
    }
}

 

posted @ 2024-03-14 17:15  分享彼此成长  阅读(8)  评论(0)    收藏  举报