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
这个错误的全部过程