spring配置文件中Bean中的id和name的区别

spring配置文件中Bean中的id和name的区别

原文地址:http://siye1982.iteye.com/blog/592435
在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即id和name,最近研究了一下,发现这两个属性还挺好玩的,特整理出来和大家一起分享。    
  1.id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab   "等都是不规范的,Spring在初始化时就会报错,诸如:    
   
   
  代码  
  org.xml.sax.SAXParseException:   Attribute   value   "?ab"   of   type   ID   must   be   a   name.      
   
   
  2.name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a   b","   abc",,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:    
   
   
  代码  
  org.springframework.beans.factory.NoSuchBeanDefinitionException:   No   bean   named   'a   b'   is   defined      
   
   
  3.配置文件中不允许出现两个id相同的<bean>,否则在初始化时即会报错,如:    
   
   
  代码  
  org.xml.sax.SAXParseException:   Attribute   value   "aa"   of   type   ID   must   be   unique   within   the   document.      
   
  4.但配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那个 <bean>被后面同名的   <bean>覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。  
   
  5.name属性可以用,隔开指定多个名字,如<bean   name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1")   getBean("a2")   getBean("a3")返回的都是同一个实例(假设是singleton的情况)    
   
  6.如果id和name都没有指定,则用类全名作为name,如<bean   class="com.stamen.BeanLifeCycleImpl">,则你可以通过    
  getBean("com.stamen.BeanLifeCycleImpl")返回该实例。  
   
  7.如果存在多个id和name都没有指定,且实例类都一样的<bean>,如:    
   
   
  代码  
  <bean   class="com.stamen.BeanLifeCycleImpl"/>        
        <bean   class="com.stamen.BeanLifeCycleImpl"/>        
        <bean   class="com.stamen.BeanLifeCycleImpl"/>      
   
  则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,    
  第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,    
  第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。    
   
  [小结]    
  当然,这些都是奇技淫巧,不足以去实践,通过id指定唯一名称才是阳光大道,其他仅作为一笑而过的见闻罢了。  

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值