谈谈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.biao.GroupThreadImpl")返回该实例。

7.如果存在多个id和name都没有指定,且实例类都一样的<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 胡鹏 阅读(347) 评论(0)  编辑  收藏 所属分类: spring


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

常用链接

留言簿(3)

随笔分类

随笔档案

agile

搜索

最新评论

阅读排行榜

评论排行榜