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属性完成Beanid属性在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
2
3
4
<!-- 面代码为该Bean指定三个别名:#abc,@123,abc* -->
<bean id="person" class="..." name="#abc,@123,abc*"/>
<alias name="person" alias="jack"/>
<alias name="jack" alias="jackee">
  • 上面第一行代码的name属性为该Bean指定了三个别名#abc@123abc* ,这些别名中包含了些特殊字符,由此可见,作为别名的字符可以很随意。
  • 上面配置的后两行代码则用于为已有的person这个Bean指定别名。