7.3.1 bean的命名

每个bean都有一个或多个标识符。在承载bean的容器中这些标识符必须是唯一的。一个bean通常只有一个标识符,但如果需要有一个以上的标识符,其他的可以认为是别名。

在基于XML的配置元数据中,使用id和/或name属性来指定bean的标识符。id属性允许您精确地指定一个ID。习惯上,这些命名都是数字和字母('myBean', 'fooService'等),但是也可以包含特殊字符。如果想给bean引入其他别名,也可以在name属性上指定,用逗号(,)、分号(;)或空格分隔。在Spring3.1以前的版本,id属性被定义为xsd:ID类型,只能使用有限的字符,不过这已成为了历史。自3.1版本起,id被定义为xsd:string类型。需要注意,容器仍然强制要求bean的ID唯一,但是XML解析器不再限制。

给bean提供一个名称或ID并不是必需的。如果没有明确提供名称或ID,容器会为bean生成一个唯一的名称。然而,如果想通过使用ref元素或Service Locator式的查找依靠名称来引用bean,那么必须提供一个名称。不提供名称的动机一般和使用内部bean协作对象的自动绑定有关。

bean的命名规约

当命名bean时,使用标准的Java对实例属性名的规约。即,bean的名字由一个小写字母开始,之后采用驼峰式(camel-cased)。这样的例子有(不包括引号):'accountManager''accountService''userDao''loginController'等。

一致地命名bean使配置更易阅读和理解,如果您正在使用Spring的AOP,当向一组名称有联系的bean施加advice时会大有帮助。

在bean的定义外起别名

在bean定义中,通过组合使用至多一个由id属性指定的名称和任意数量由name属性的名称,可以给bean提供多于一个的名称。对同一个bean来说,这些名称可能是等效的别名,这在一些情况下很有用,如允许程序中的每个组件通过使用一个专用于该组件的bean名称来引用公共依赖。

然而,在bean被实际定义的地方指定全部的别名往往是不够的。有时需要为在别处定义的bean引入一个别名。这是大系统中常见的情况,各子系统分别配置,每个子系统都有自己定义的一组对象。在基于XML的配置元数据中,可以使用<alias/>元素来完成这一目标。

<alias name="fromName" alias="toName"/>

在这个例子中,同一容器中被命名为fromName的bean在使用别名定义后也可以被称为toName

例如,子系统A的配置元数据可能通过名称subsystemA-dataSource引用一个DataSource,子系统B的配置元数据可能通过名称subsystemB-dataSource引用一个DataSource,当使用这两个子系统组成主程序时,主程序可能通过名称myApp-dataSource引用DataSource。要让全部三个名称指向同一个对象,向MyApp的配置元数据中加入如下别名定义:

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />

现在,通过一个唯一且保证不会与任何其他定义(实质上创建了一个命名空间)发生冲突的名称,每个组件和主程序都引用了该数据源,他们指向的是同一个bean。

Java-configuration

如果使用Java-configuration,可以使用@Bean注解提供别名,细节请阅7.12.3 使用@Bean注解


书籍推荐