天天看点

SpringFramework核心技术一(IOC:命名bean)一、如何命名Bean二、给Bean命名的约定三、在Bean定义了名字基础上给Bean取一个别名

命名Bean

每个bean都有一个或多个标识符。这些标识符在托管bean的容器内必须是唯一的。一个bean通常只有一个标识符,但是如果它需要多个标识符,额外的标识符可以被认为是别名。

一、如何命名Bean

在基于XML的配置元数据中,可以使用id和/或name属性来指定bean标识符。该id属性允许您指定恰好一个ID。通常,这些名称是字母数字(’myBean’,’fooService’等),但也可能包含特殊字符。

如果要将其他别名引入到bean中,还可以在name 属性中指定它们,并用逗号(,),分号(;)或空格分隔。

作为历史记录,在Spring 3.1之前的版本中,该id属性被定义为一种xsd:ID类型,它限制了可能的字符。

从3.1开始,它被定义为一种xsd:string类型。请注意,Bean id唯一性仍由容器强制执行,尽管不再由XML解析器执行。

您不需要为bean提供名称或标识。如果没有显式提供名称或标识,容器为该bean生成一个唯一名称。

但是,如果您想通过名称来引用该bean,则通过使用ref元素或 服务定位器样式查找,您必须提供一个名称。

不提供名称的目的,与使用内部bean和自动装配协作者有关。

二、给Bean命名的约定

2.1 驼峰命名

约定是在命名bean时使用标准Java约定作为实例字段名称。也就是说,bean名称以小写字母开头,并且从此开始以骆驼为基础。这种名称的例子将是(不带引号)’accountManager’, ‘accountService’,’userDao’,’loginController’,等等。

命名bean始终使您的配置更易于阅读和理解,如果您使用的是Spring AOP,则将建议应用于与名称相关的一组bean时会有很大帮助。

2.2 类路径扫描

通过类路径中的组件扫描,Spring根据以上规则为未命名的组件生成bean名称:本质上,采用简单的类名称并将其初始字符变为小写。然而,在(不寻常的)特殊情况下,当有多个字符并且第一个和第二个字符都是大写字母时,原始外壳将被保留。这些规则与java.beans.Introspector.decapitalizeSpring 定义的规则相同(Spring在此使用的规则)。

三、在Bean定义了名字基础上给Bean取一个别名

3.1 取别名

在bean定义本身中,可以通过使用最多由id属性指定的一个名称和属性中任意数量的其他名称的组合来为bean提供多个名称name。这些名称可以等同于同一个bean的别名,并且对于某些情况很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的bean名称引用公共依赖项。

然而,指定bean实际定义的所有别名并不总是足够的。有时候需要为别处定义的bean引入别名。在大型系统中,这种情况通常是这样的,其中配置分布在每个子系统中,每个子系统都有自己的一组对象定义。在基于XML的配置元数据中,您可以使用该下面元素来完成此操作。

在这种情况下,被命名的相同容器中的bean 原名字fromName也可以在使用该别名定义之后被称为toName。

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

3.2举个例子

例如,子系统A的配置元数据可以通过名称引用数据源subsystemA-dataSource。子系统B的配置元数据可以通过名称引用数据源subsystemB-dataSource。在编写使用这两个子系统的主应用程序时,主应用程序通过名称引用数据源myApp-dataSource。要让所有三个名称都引用您添加到MyApp配置元数据中的同一对象,请使用以下别名定义:

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

现在,每个组件和主应用程序都可以通过一个唯一的名称来引用dataSource,并保证不会与任何其他定义冲突(有效地创建名称空间),但它们引用同一个bean。

提示:如果您正在使用Java配置,则@Bean注释可用于提供别名。

未完待续~~~