7.5.1 Bean的基本定义和Bean别名
7.5.1 Bean的基本定义和Bean别名
beans元素
<beans>
元素是Spring
配置文件的根元素,该元素可以指定如下属性
<beans> 元素的属性 |
描述 |
---|---|
default-lazy-init |
指定该<beans> 元素下配置的所有Bean 默认的延迟初始化行为。 |
default-merge |
指定该<beans> 元素下配置的所有Bean 默认的merge 行为. |
default- autowire |
指定该<beans> 元素下配置的所有Bean 默认的自动装配行为。 |
default-autowire-candidates |
指定该<beans> 元素下配置的所有Bean **默认是否作为自动装配的候选Bean **。 |
default-init-method |
指定该<beans> 元素下配置的所有Bean 默认的初始化方法。 |
default-destroy-method |
指定该< beans.> 元素下配置的所有Bean 默认的回收方法。 |
<beans>
元素下所能指定的属性都可以在每个<bean>
子元素中指定,只要将属性名去掉default
即可。也就是bean
元素上可以指定lazy-init
属性,来配置该Bean
的默认延迟初始化行为。
在<beans>
元素上指定和在<bean>
上指定的区别是:
- 如果为
<bean>
元素指定这些属性,只对特定Bean
起作用; - 如果为
<beans>
元素指定这些属性,这些属性将会对<beans>
包含的所有Bean
都起作用。
当二者所指定的属性不一致时,<bean>
下指定的属性会覆盖<beans>
下指定的属性。
bean元素
<bean>
元素是<beans>
元素的子元素,<beans>
元素可以包含多个<bean>
子元素,每个<bean>
子元素定义一个Bean
,每个Bean
对应Spring
容器里的一个Java
实例。
bean元素常用属性
定义Bean
时,通常需要指定两个属性。
<bean> 元素常用属性 |
描述 |
---|---|
id |
确定该Bean 的唯一标识,容器对Bean 的管理、访问,以及该Bean 的依赖关系,都通过id 属性完成。Bean 的id 属性在Spring 容器中应该是唯一的. |
class |
指定该Bean 的具体实现类 ,这里不能是接口。Spring 容器必须知道创建Bean 的实现类,而不能是接口。在通常情况下, Spring 会直接使用new 关键字创建该Bean 的实例,因此,这里必须提供Bean 实现类的类名。 |
在一些特殊的情况下, Spring 会采用其他方式创建Bean 实例,例如工厂方法等,则可能不再需要class 属性。这些内容需要参考后面的介绍。 |
通过name属性在定义Bean是给Bean指定别名
id
属性是容器中Bean
的唯一标识,这个id
属性必须遵循XML
文档的i属性规则,因此有一些特殊要求,例如不能以"/"
等特殊字符作为属性值。但在某些特殊的情况下,Bean
的标识必须包含这些特殊符号,此时可以采用name
属性,用于指定Bean
的别名,通过访问Bean
别名也可访问Bean
实例。
除了可以为<bean>
元素指定一个id
属性之外,还可以为<bean>
元素指定name
属性,用于为Bean
实例指定别名
。
<bean>
元素的id
属性具有唯一性,而且是一个真正的XML ID
属性,因此其他XML
元素在引用该id
时,可以利用XML
解析器的验证功能。
id属性命名规范
由于XML
规范规定了XML ID
标识符必须由字母
和数字
组成,且只能以字母开头
。
为什么要使用别名
在一些特殊的情况下(例如与Struts 1
整合过程中),必须为某些Bean
指定特殊标识名
,此时就必须为控制器Bean
指定别名。
在其他地方为一个已经存在的Bean实例指定别名
在一些极端的情况下,程序无法在定义Bean
时就指定所有的别名,而是需要在其他地方为一个已经存在的Bean
实例指定别名,则可使用<alias>
元素来完成,该元素可指定如下两个属性。
<alias> 元素的属性 |
描述 |
---|---|
name |
该属性指定一个Bean 实例的标识名,表明将为该Bean 实例指定别名。 |
alias |
指定一个别名。 |
例如以下示例配置:
1 | <!-- 面代码为该Bean指定三个别名:#abc,@123,abc* --> |
- 上面第一行代码的
name
属性为该Bean
指定了三个别名#abc
,@123
,abc*
,这些别名中包含了些特殊字符,由此可见,作为别名的字符可以很随意。 - 上面配置的后两行代码则用于为已有的
person
这个Bean
指定别名。