7.3.1 bean的命名
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注解。