在BeanFactory的配置中,<bean>是我們最常見的配置項(xiàng),它有兩個(gè)最常見的屬性,即id和name,最近研究了一下,發(fā)現(xiàn)這兩個(gè)屬性還挺好玩的,特整理出來和大家一起分享。 1.id屬性命名必須滿足XML的命名規(guī)范,因?yàn)閕d其實(shí)是XML中就做了限定的??偨Y(jié)起來就相當(dāng)于一個(gè)Java變量的命名:不能以數(shù)字,符號(hào)打頭,不能有空格,如123,?ad,"ab "等都是不規(guī)范的,Spring在初始化時(shí)就會(huì)報(bào)錯(cuò),諸如:
代碼:
|
org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name. |
2.name屬性則沒有這些限定,你可以使用幾乎任何的名稱,如?ab,123等,但不能帶空格,如"a b"," abc",,這時(shí),雖然初始化時(shí)不會(huì)報(bào)錯(cuò),但在getBean()則會(huì)報(bào)出諸如以下的錯(cuò)誤:
代碼:
|
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined |
3.配置文件中不允許出現(xiàn)兩個(gè)id相同的<bean>,否則在初始化時(shí)即會(huì)報(bào)錯(cuò),如:
代碼:
|
org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document. |
4.但配置文件中允許出現(xiàn)兩個(gè)name相同的<bean>,在用getBean()返回實(shí)例時(shí),后面一個(gè)Bean被返回,應(yīng)該是前面那個(gè)<bean>被后面同名的 <bean>覆蓋了。有鑒于此,為了避免不經(jīng)意的同名覆蓋的現(xiàn)象,盡量用id屬性而不要用name屬性。
5.name屬性可以用,隔開指定多個(gè)名字,如<bean>,相當(dāng)于多個(gè)別名,這時(shí)通過getBean("a1") getBean("a2") getBean("a3")返回的都是同一個(gè)實(shí)例(假設(shè)是singleton的情況)
6.如果id和name都沒有指定,則用類全名作為name,如<bean>,則你可以通過 getBean("com.stamen.BeanLifeCycleImpl")返回該實(shí)例。
7.如果存在多個(gè)id和name都沒有指定,且實(shí)例類都一樣的<bean>,如:
代碼:
|
<bean> ? ?<bean> ? ?<bean> |
則第一個(gè)bean通過getBean("com.stamen.BeanLifeCycleImpl")獲得, 第二個(gè)bean通過getBean("com.stamen.BeanLifeCycleImpl#1")獲得, 第三個(gè)bean通過getBean("com.stamen.BeanLifeCycleImpl#2")獲得,以此類推。
[小結(jié)] 當(dāng)然,這些都是奇技淫巧,不足以去實(shí)踐,通過id指定唯一名稱才是陽光大道,其他僅作為一笑而過的見聞罷了。
|