Spring配置中的id和name屬性

 

在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指定唯一名稱纔是陽光大道,其他僅作爲一笑而過的見聞罷了。

 

http://wxfstwxf.iteye.com/blog/1470485

發佈了2 篇原創文章 · 獲贊 1 · 訪問量 6230
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章