Chinaunix首页 | 论坛 | 博客
  • 博客访问: 953342
  • 博文数量: 168
  • 博客积分: 3853
  • 博客等级: 中校
  • 技术积分: 1854
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-15 23:50
文章分类

全部博文(168)

文章存档

2014年(12)

2013年(46)

2012年(60)

2011年(11)

2010年(1)

2009年(17)

2008年(21)

我的朋友

分类: 系统运维

2009-04-29 10:51:52


在BeanFactory的配置中,是我们最常见的配置项,它有两个最常见的属性,即idname,最近研究了一下,发现这两个属性还挺好玩的,特整理出来和大家一起分享。
1.id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab "等都是不规范的,Spring在初始化时就会报错,诸如:

Java代码
  1. org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name.  


2.name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:

Java代码
  1. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined  


3.配置文件中不允许出现两个id相同的,否则在初始化时即会报错,如:

Java代码
  1. org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document.  
4.但配置文件中允许出现两个name相同的,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那个被后面同名的 覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。

5.name属性可以用,隔开指定多个名字,如name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)

6.如果idname都没有指定,则用类全名作为name,如,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")返回该实例。

7.如果存在多个idname都没有指定,且实例类都一样的,如:


  
   则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,
第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,
第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。

[小结]
阅读(1121) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~