1. 程式人生 > >spring配置檔案中Bean中的id和name的區別

spring配置檔案中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")獲得,以此類推。