Spring 中bean与id 即默认值

转载 2016年08月30日 10:49:49
在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")获得,以此类推。


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

相关文章推荐

spring 配置时 bean id 与bean name 的区别

简单的说:id用来标识bean,是唯一的,且只有一个;name定义的是bean的alias,可以有多个,并可能与其他的bean重名。 详细的说: id是唯一标识bean.不能用特殊字符:×#@ ,...
  • dys1990
  • dys1990
  • 2011年09月07日 00:59
  • 23157

[JAVA][Spring]Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别

Spring中Bean的命名 1、每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一; 2、可以不指定id属性,只指定全限定类...

spring 动态创建bean

应用场景:查询业务为主,多个数据源,根据不同的请求,切换到不同的数据源;   1:创建DynamicDataSource 扩展一个Spring提供的AbstractRoutingDataSource,...
  • getdate
  • getdate
  • 2014年02月27日 16:51
  • 17073

Spring中用@Component、@Repository、@Service和 @Controller等标注的默认Bean名称会是小写开头的非限定类名

今天用调度平台去调用bean中的方法时,提示找不到bean。经查,发现是由于如果在标注上没有提供name属性值,则默认的bean名称是小写开头的,而不是大写开头的。下面是其他文档参阅:使用过滤器自定义...

谈谈spring中bean的名字

谈谈spring中bean的名字      提到bean的名字,就要从声明bean的地方说起。在应用spring时,有两个地方可以声明一个bean,一个是在spring的配置文件中,一个是在代码中通...

给JavaBean赋默认值并且转Json字符串

软件测试技术交流群 : 429183023 今日在工作中整理dubbo接口的时候,有些接口参数类型是JavaBean类型的数据,在整理的时候又想直接将JavaBean参数直接以默认的js...
  • qi_lin7
  • qi_lin7
  • 2017年03月29日 18:41
  • 1065

如何修改类的成员属性的默认值

这是一道黑马入学测试题: 存在一个JavaBean,它包含以下几种可能的属性: 1:boolean/Boolean 2:int/Integer 3:String 4:double/Do...

Spring详解-----------AOP通知、代理

通知参数  前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式。 使用JoinPoint获取:Spring ...

利用SPring AOP配置切面的一个例子

这个例子,就是对于DukePerformer类,在它的演奏方法perform执行前,输出观众找座位takeSeat和关手机turnOffPhone,在执行后,输出观众鼓掌applaud。 将代码提取...

Spring 中bean与id 即默认值

在BeanFactory的配置中,是我们最常见的配置项,它有两个最常见的属性,即id和name,最近研究了一下,发现这两个属性还挺好玩的,特整理出来和大家一起分享。 1.id属性命名必须满足XML的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring 中bean与id 即默认值
举报原因:
原因补充:

(最多只允许输入30个字)