談?wù)凷pring配置中的id和name屬性有意思的地方(轉(zhuǎn))
其實(shí)這篇文章很早看到的,但仔細(xì)想想其實(shí)沒多大意思,有一次維護(hù)代碼的時(shí)候,發(fā)現(xiàn)一些看似有意思的寫法,就在本博記錄下,容易遺忘。
小技巧感覺上很有意思,但并不是很實(shí)用,容易理解的配合,方便維護(hù)的配置,才是最好的代碼。搞點(diǎn)小技巧,不方便維護(hù)。
在BeanFactory的配置中,<bean>是我們最常見的配置項(xiàng),它有兩個最常見的屬性,即id和name,最近研究了一下,發(fā)現(xiàn)這兩個屬性還挺好玩的,特整理出來和大家一起分享。
1.id屬性命名必須滿足XML的命名規(guī)范,因?yàn)閕d其實(shí)是XML中就做了限定的。總結(jié)起來就相當(dāng)于一個Java變量的命名:不能以數(shù)字,符號打頭,不能有空格,如123,?ad,"ab "等都是不規(guī)范的,Spring在初始化時(shí)就會報(bào)錯,
org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name.
2.name屬性則沒有這些限定,你可以使用幾乎任何的名稱,如?ab,123等,但不能帶空格,如"a b"," abc",,這時(shí),雖然初始化時(shí)不會報(bào)錯,但在getBean()則會報(bào)出諸如以下的錯誤:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined
3.配置文件中不允許出現(xiàn)兩個id相同的<bean>,否則在初始化時(shí)即會報(bào)錯,如:
org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document.
4.但配置文件中允許出現(xiàn)兩個name相同的<bean>,在用getBean()返回實(shí)例時(shí),后面一個Bean被返回,應(yīng)該是前面那個<bean>被后面同名的 <bean>覆蓋了。有鑒于此,為了避免不經(jīng)意的同名覆蓋的現(xiàn)象,盡量用id屬性而不要用name屬性。
5.name屬性可以用,隔開指定多個名字,如<bean name="b1,b2,b3">,相當(dāng)于多個別名,這時(shí)通過getBean("a1")
getBean("a2") getBean("a3")返回的都是同一個實(shí)例(假設(shè)是singleton的情況)
6.如果id和name都沒有指定,則用類全名作為name,如<bean
class="com.stamen.BeanLifeCycleImpl">,則你可以通過
getBean("com.biao.GroupThreadImpl")返回該實(shí)例。
7.如果存在多個id和name都沒有指定,且實(shí)例類都一樣的<bean>,如:
<bean class="com.biao.GroupThreadImpl"/>
<bean class="com.biao.GroupThreadImpl"/>
<bean class="com.biao.GroupThreadImpl"/>
則第一個bean通過getBean("com.biao.GroupThreadImpl")獲得,
第二個bean通過getBean("com.biao.GroupThreadImpl#1")獲得,
第三個bean通過getBean("com.biao.GroupThreadImpl#2")獲得,以此類推。
posted on 2009-11-03 17:10 胡鵬 閱讀(363) 評論(0) 編輯 收藏 所屬分類: spring