`
XTU_xiaoxin
  • 浏览: 239910 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(精典) Spring配置中id和name属性的值能相等吗?(讨论)

阅读更多
   最近,我在使用Spring的时候,出现这样一个问题,令我感到迷惑,各位如果有时间,请帮忙研究下,帮小弟我解决这个问题。问题大致是这样的:

以前,在网上看到很多文章,大致意思是说在Spring的配置文件中,id的值不允许相同,但是name的值是可以相同的,并且,如果name相同,在通过getBean获得bean对象实例时,后配置的bean将会覆盖先前配置中name值相同的bean,比如说这篇博文:
http://blog.csdn.net/dagouaofei/archive/2009/07/01/4313431.aspx
但是,在我测试时(多个bean的name属性配置成相同的值),居然出现了异常,异常大致信息是说“beianName 已经在当前文件中使用了”。

这种现象和网上说的不符啊,于是,我看了下源码,真的不是网上说的那么回事,源码我贴出来,各位参考下:
BeanDefinitionParserDelegate类为配置文件解析代理类,以下为此类中的两个方法:

/**
	 * Parses the supplied <code>&lt;bean&gt;</code> element. May return <code>null</code>
	 * if there were errors during parse. Errors are reported to the
	 * {@link org.springframework.beans.factory.parsing.ProblemReporter}.
	 */
	public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {
		String id = ele.getAttribute(ID_ATTRIBUTE);  //获得Bean的id名
		String nameAttr = ele.getAttribute(NAME_ATTRIBUTE); //获得Bean的name字符串

		//拆分Bean的name字符串为多个Bean的name,然后存入List中
		List aliases = new ArrayList();
		if (StringUtils.hasLength(nameAttr)) {
			String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, BEAN_NAME_DELIMITERS);
			aliases.addAll(Arrays.asList(nameArr));
		}
       
		 //将Bean的id名赋值给beanName   注:beanName和Bean的name不是同一个概念
		String beanName = id;
		//如果bean的id为null或“”,则将Bean的name的List集合中第一个值赋值给BeanName
		if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
			beanName = (String) aliases.remove(0);
			if (logger.isDebugEnabled()) {
				logger.debug("No XML 'id' specified - using '" + beanName +
						"' as bean name and " + aliases + " as aliases");
			}
		}
        /*
         * 此处进行BeanName验
         */
		if (containingBean == null) {
			checkNameUniqueness(beanName, aliases, ele);
		}
......

checkNameUniqueness方法内容:
         /**
	 * @description 此方法中的usedNames为一Set集合,所有的BeanName将存入此set中
	 * @param beanName 
	 *        需要验证的beanName
	 * @param aliases bean的name的List集合
	 * @param beanElement
	 */
	private void checkNameUniqueness(String beanName, List aliases, Element beanElement) {
		String foundName = null;
        
		/*
		 * 如果beanName不为空并且usedNames(set集合)中已经存在了此beanName,则赋值给foundName
		 */
		if (StringUtils.hasText(beanName) && this.usedNames.contains(beanName)) {
			foundName = beanName;
		}
		this.usedNames.add(beanName); //将当前beanName添加的集合中

		if (foundName == null) {
			/*
			 * 找出usedNames集合中和aliases结合中第一个相等的元素,并赋值给foundName
			 */
			foundName = (String) CollectionUtils.findFirstMatch(this.usedNames, aliases);
		}
		this.usedNames.addAll(aliases); //将bean的name集合(bean的所有别名)存入到usedNames中

		//如果foundName不为空,则抛出当前beanName已经存在的异常	
		if (foundName != null) {
			getReaderContext().error("Bean name '" + foundName + "' is already used in this file.", beanElement);
		}
	}

从源码中可以看出,配置文件中所有Bean的name的值不仅不能相同,而且bean的id的值和bean的name的值也不能相同,包括bean的别名也一样。这是怎么回事?难道是我理解错了?还是spring版本太低了(我采用的是2.0的)?还是网上说的有误?(可是这样的文章很多,都是那个意思,我想有误的可能性很少吧)。所以,如果哪位知道的,请留言告诉我,不胜感激。
0
0
分享到:
评论
2 楼 ilovejava1988 2017-02-22  
checkNameUniqueness(String beanName, List aliases, Element beanElement)这个方法你理解的有问题,同一个bean中id节点属性和name节点属性值是可以相同的,但是不同bean是不能相同的
1 楼 yfnok 2010-04-19  
应该是版本问题——我猜

相关推荐

    Spring论坛精典文章

    关于Spring Framework,今年夏天你可能已经听见很多的议论。在本文中,我将试图解释Spring能完成什么,和我怎么会认为它能帮助你开发J2EE应用程序

    路由器与三层交换的精典配置

    在实际工作中,理解并掌握路由器和三层交换的配置不仅能提升工作效率,还能确保网络的稳定性和安全性。因此,无论是理论学习还是实践操作,都应当重视这两个设备的配置知识。通过深入研究“路由器与三层交换的精典...

    SSM(SpringMVC Spring Mybatis) 蓝色精典MUI后台管理模板.zip

    SSM(SpringMVC、Spring、Mybatis)框架是Java Web开发中常用的一种技术栈,由Spring MVC负责处理HTTP请求,Spring提供依赖注入和事务管理,而Mybatis作为持久层框架,负责数据库交互。这个“蓝色经典MUI后台管理...

    精典网页的代码及JS一些精典例子

    本资源包“精典网页的代码及JS一些精典例子”专注于讲解JavaScript在实际网页开发中的应用,特别是下拉框的动态效果、级联菜单的实现以及数组的巧妙运用。 首先,下拉框的移动是网页设计中常见的一种交互元素。在...

    精典源码之夏普名片扫描.rar

    通常,这样的压缩包会包括源代码文件(如`.java`、`.cpp`或`.py`)、配置文件、资源文件(如图像、字体等)、编译脚本和可能的文档。 深入到具体知识点,我们可以期待源码中涵盖以下内容: 1. 图像采集:源码可能...

    java面试精典题目

    Java面试精典题目涵盖了许多核心概念和技术,是评估求职者技术实力的重要依据。这些题目旨在测试应聘者对Java语言的理解深度、编程能力以及在实际项目中的应用经验。下面,我们将详细探讨一些常见的Java面试知识点:...

    spring2.5+hibernate3.2+struts2.0整合解析(精典案例)

    spring2.5+hibernate3.2+struts2.0整合解析(精典案例),个人强烈推荐!

    用来脱口而出的100个精典句子(doc)

    用来脱口而出的100个精典句子 Any day will do? 哪一天都可以? Any messages for me? 有我的留言吗? Are you by yourself? 你一个人来吗? All right with you? 你没有问题吧? Are you free tomorrow? ...

    Struts2.2.3Spring3.1ibatis2.0整合精典案例

    此案例是学习struts2 spring3 ibatis整合的极品案例,里面涉及到了增删改查,数据库使用oracle数据库。页面请求全部使用ajax请求,数据传输以JSON格式传输,并且使用的是struts2 的JSON技术。页面js使用Jquery1.6 ,...

    php精典雅php精典php精典php精典

    例如,了解类和对象的使用能帮助开发者创建可复用的代码模块,而对文件操作的理解,则是开发数据密集型应用不可或缺的。 在PHP编程中,安全性始终是不可忽视的重要方面。《PHP精典》在这一部分详细讲解了如何通过...

    精典微信投票系统

    精典微信投票系统

    精典的SQL语句。行转列,列转行的语句

    本文共分六个部分,分别讨论精典的SQL语句,行转列,列转行的语句,行列转换、取得数据表的所有列名、更改用户密码、判断表的哪些字段不允许为空、找到含有相同字段的表六个方面。 一、行列转换--普通 在实际应用...

    java精典编程100例 22

    if (this.id == other.id && this.name.equals(other.name)) { return true; } ``` 5. **返回结果**:最后返回比较的结果。 #### 五、最佳实践 1. **使用`Objects.equals`方法**:为了简化代码并提高可读性,...

    sql精典语句收集

    例如,`INSERT INTO table_name (column1, column2) VALUES (value1, value2)` 将在table_name中插入一行新数据,其中column1和column2是列名,value1和value2是对应的值。 3. UPDATE语句:用于修改已存在于数据库...

    java精典编程100例

    本例介绍了如何读取和写入文本文件中的学生数据。这里可能会涵盖如何使用Java的文件I/O类库(如 `BufferedReader` 和 `BufferedWriter`)来处理文本文件。此外,还会涉及如何解析文本文件中的数据,并将其转换为Java...

    精典源码之传说中的3D影音播放器源码.zip

    【标题】"精典源码之传说中的3D影音播放器源码.zip" 提供的是一份关于3D影音播放器的源代码,这通常是一个软件项目,旨在展示如何实现三维视频和音频的播放功能。在IT领域,3D影音播放器涉及到多个技术层面,包括...

    J2EE应用编程精典150例

    本资料“J2EE应用编程精典150例”显然是针对那些希望深入理解和掌握J2EE技术的开发者们,通过150个具体的实例,帮助他们提升技能,解决实际问题。 1. **Java基础知识**:作为J2EE的基础,Java语言的扎实理解是必要...

    硬盘维修精典教材.rar

    硬盘大全,硬盘数据恢复教程,硬盘维修技术资料,硬盘维修精典教材,硬盘芯片级维修。。。。等 硬盘大全,硬盘数据恢复教程,硬盘维修技术资料,硬盘维修精典教材,硬盘芯片级维修。。。。等 硬盘大全,硬盘数据...

    精典DOS实用技术.pdf

    尽管提供的部分内容没有实质性的技术细节,但基于标题“精典DOS实用技术.pdf”和描述中的重复文本,我们可以围绕DOS系统的基础知识、常用命令、高级技巧等方面展开讨论。 ### DOS基础知识 #### 1. DOS概述 DOS...

Global site tag (gtag.js) - Google Analytics