Spring 源码解析错误来源

Spring 源码解析错误来源

错误之bean name *** is already used in this <beans> element

在spring源码中,在对配置文件进行解析的时候,会对bean标签里面的ID属性值进行校验,方法checkNameUniqueness(String beanName, List<String> aliases, Element beanElement)
下面看一下这个方法的具体实现

    /**
     * Stores all used bean names so we can enforce uniqueness on a per
     * beans-element basis. Duplicate bean ids/names may not exist within the
     * same level of beans element nesting, but may be duplicated across levels.
     * 用于存放已经注册过的beanName
     */
    private final Set<String> usedNames = new HashSet<>();
    protected void checkNameUniqueness(String beanName, List<String> aliases, Element beanElement){
        String foundName = null;   //临时变量,用于校验beanName是否已经被注册过了
        if(StringUtils.hasText(beanName) && this.userNames.contains(beanName)){
            /**
             *如果传入的beanName有值,且userNames里面已经存在了beanName,则说明beanName已经注册过
             *了,则讲beanName的赋给foundName。
             */
            foundName = beanName;
        }
        if(foundName == null){
            /***
             * 如果通过的beanName,也就是bean标签的ID属性的校验,Name接下来会对bean标签的name属性进行校
             * 验,name属性是用来给bean增加别名使用的,可以传入多个,使用,或者;隔开即可。
             * 使用
             * CollectionUtils.findFirstMatch(Collection<?> source,Collection<String> candidates)
             * 方法进行校验
             * 该方法的作用是:如果candidates存在与source里面,则返回source里面的一个匹配的值;
             * 如果不存在,则返回NULL
             * 
             */
            foundName = CollectionUtils.findFirstMath(this.userNames, beanName);
        }
        /***
         * 至此对于bean标签中ID及name属性的校验就全部完成了,下面就是对校验结果的判断了
         * 如果ID或者name属性已经被注册过了,则会进入下面的if语句,
         * 输出相关的错误信息
         * Bean name foundName is already used in this <beans> element
         */
         if(foundName != null){
             error("Bean Name '" + foundName + "' is already used in this <beans> element" , beanElement);
         }
         /***
         * 如果上述校验均通过,则讲beanName及aliases加入到userNames里面
         */
         this.userNames.add(beanName);
         this.userNames.addAll(aliases);
}

以上就是产生bean name *** is already used in this <beans> element这个错误的全部过程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值