spring-framework-reference(5.1.1.RELEASE)中文版——Core部分 (4)

除了包含关于如何创建特定bean的信息的bean定义之外,ApplicationContext实现还允许注册容器之外创建的现有对象(由用户创建)。
通过getBeanFactory()方法访问ApplicationContext的BeanFactory,该方法返回BeanFactory DefaultListableBeanFactory实现。DefaultListableBeanFactory通过registerSingleton(..)和registerBeanDefinition(..)方法支持此注册。但是,典型的应用程序只使用通过元数据bean定义定义的bean。

Bean元数据和手动提供的单例实例需要尽早注册,以便容器在自动连接和其他自省步骤期间正确地推断它们。虽然在一定程度上支持覆盖现有的元数据和现有的单例实例,但是在运行时注册新bean(与对工厂的实时访问同时进行)并没有得到正式支持,并且可能导致并发访问异常、bean容器中的不一致状态,或者两者都有。

Naming Beans

每个bean都有一个或多个标识符。这些标识符在承载bean的容器中必须是唯一的。bean通常只有一个标识符。但是,如果需要一个以上的别名,则可以将额外的别名看作别名。

在基于xml的配置元数据中,可以使用id属性、name属性或两者来指定bean标识符。id属性允许您指定一个id。按照惯例,这些名称是字母数字(“myBean”、“someService”等),但它们也可以包含特殊字符。如果希望为bean引入其他别名,还可以在name属性中指定它们,用逗号(、)、分号(;)或空格分隔。作为历史记录,在Spring 3.1之前的版本中,id属性被定义为xsd: id类型,这限制了可能的字符。在3.1中,它被定义为xsd:string类型。请注意,bean id惟一性仍然由容器强制执行,但不再由XML解析器强制执行。

您不需要为bean提供名称或id。如果没有显式地提供名称或id,容器将为该bean生成唯一的名称。但是,如果希望通过引用ref元素或服务定位器样式查找来引用bean的名称,则必须提供名称。不提供名称的动机与使用内部bean和自动连接合作者有关。

Bean 命名约定

约定是在命名bean时使用标准Java约定作为实例字段名。也就是说,bean名称以小写字母开头,然后以驼色大小写字母开头。这些名字的例子包括accountManager,accountService, userDao, loginController, 等等。

一致地命名bean使您的配置更容易阅读和理解。另外,如果您使用Spring AOP,那么在向一组名称相关的bean应用建议时,它会有很大帮助。

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

Aliasing a Bean outside the Bean Definition

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

然而,指定bean实际定义的所有别名并不总是足够的。
有时需要为其他地方定义的bean引入别名。在大型系统中,配置通常在每个子系统之间进行分配,每个子系统都有自己的一组对象定义。在基于xml的配置元数据中,可以使用元素来完成此任务。下面的例子展示了如何做到这一点:

<alias alias="toName"/>

在这种情况下,命名为fromName的bean(在同一个容器中)也可以在使用这个别名定义之后称为toName。
例如,子系统A的配置元数据可以通过subsystemA-dataSource的名称引用数据源。子系统B的配置元数据可以通过subsystemB-dataSource的名称引用数据源。在组合使用这两个子系统的主应用程序时,主应用程序以myApp-dataSource的名称引用数据源。要使所有三个名称都指向同一个对象,可以向配置元数据添加以下别名定义:

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

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

Java-Configuration

如果使用Javaconfiguration,那么可以使用@Bean注释来提供别名。有关详细信息,请参阅使用@Bean注释。

Instantiating Beans

bean定义本质上是创建一个或多个对象的配方。容器在请求时查看命名bean的配方,并使用该bean定义封装的配置元数据来创建(或获取)实际对象。

如果使用基于xml的配置元数据,则指定要在元素

通常,在容器本身通过反射性地调用其构造函数直接创建bean的情况下,指定要构造的bean类,这在某种程度上类似于使用new操作符的Java代码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdjpw.html