Spring IoC 容易管理一个或者多个 bean。 bean 由应用到到容器的配置元数据创建,例如,在 XML 中定义 的形式。容器内部,这些 bean 定义表示为 BeanDefinition 对象,其中包含(其他信息)以下元数据:
- 限定包类名称:典型的实际实现是定义 bean 的类。
- bean 行为配置元素,定义了容器中的Bean应该如何行为(范围、生命周期回调,等等)。
- bean 需要引用其他 bean 来完成工作,这些引用也称为合作者或依赖关系。
- 其他配置设置来设置新创建的对象,例如,连接使用 bean 的数量管理连接池,或者池的大小限制。
以下是每个 bean 定义的属性
属性 | 解释 |
---|---|
class | Section 6.3.2, “Instantiating beans” |
name | Section 6.3.1, “Naming beans” |
scope | Section 6.5, “Bean scopes” |
constructor | arguments Section 6.4.1, “Dependency Injection” |
properties | Section 6.4.1, “Dependency Injection” |
autowiring mode | Section 6.4.5, “Autowiring collaborators” |
lazy-initialization mode | Section 6.4.4, “Lazy-initialized beans” |
initialization method | the section called “Initialization callbacks” |
destruction method | the section called “Destruction callbacks” |
除了包含的信息里面 bean 定义的如何创建一个特定的bean, ApplicationContext 的实现还允许由用户注册现有创建在容器之外的现有对象。这是通过访问 ApplicationContext 的 BeanFactory 的 getBeanFactory() 方法 返回 BeanFactory 的实现DefaultListableBeanFactory 。DefaultListableBeanFactory 支持这种通过 registerSingleton(..) 和registerBeanDefinition(..)方法来注册。然而,典型的应用程序只能通过元数据定义的 bean 来定义。
命名bean
每个bean都有一个或多个标识符。这些标识符在托管该bean的容器中必须是唯一的。一个bean通常只有一个标识符,但是如果它需要多个标识符,那么额外的可以被认为是别名。
在基于XML的配置元数据,可以使用id和/或name属性来指定bean标识符(或多个)。该id属性允许你指定只有一个ID。通常这些名称是字母数字(’myBean’,’fooService’等),但也可能包含特殊字符。如果你想引入其他别名豆,你还可以指定它们的name 属性,用逗号分隔(,),分号(;),或空白。作为历史记,在现有春3.1版本中,id属性被定义为xsd:ID类型,其限制可能的字符。作为3.1,它定义为一个xsd:string类型。需要注意的是豆id唯一仍然由容器执行,但不再通过XML解析器。
您不需要为bean提供名称或ID。如果没有明确提供名称或ID,容器将为该bean生成唯一的名称。
约定是在命名bean时使用标准Java约定来实例字段名称。也就是说,bean名称以小写字母开头,并从那时起就开始绘制。这种名称的例子将是(不带引号)’accountManager’, ‘accountService’,’userDao’,’loginController’,等等。
通过类路径中的组件扫描,Spring会根据以上规则为未命名组件生成bean名称:基本上,使用简单的类名称并将其初始字符转换为小写。然而,在(异常)特殊情况下,如果有多个字符,并且第一个和第二个字符都是大写字母,则原始外壳将被保留。这是由定义相同的规则java.beans.Introspector.decapitalize
bean 的别名
在对 bean 定义时,除了使用 id 属性指定一个唯一的名称外,为了提供多个名称,需要通过 name 属性加以指定,所有这个名称都指向同一个bean,在某些情况下提供别名非常有用,比如为了让应用每一个组件都能更容易的对公共组件进行引用。然而,在定义 bean 时就指定所有的别名并不总是很恰当。有时我们期望能够在当前位置为那些在别处定义的bean引入别名。在XML配置文件中,可以通过 元素来完成 bean 别名的定义.
<alias name="fromName" alias="toName"/>
在这种情况下,如果容易中存在名为 fromName 的 bean 定义,在增加别名定义后,也可以用 toName 来引用。
例如,在子系统 A 中通过名字 subsystemA-dataSource 配置的数据源。在子系统B中可能通过名字 subsystemB-dataSource来引用。当两个子系统构成主应用的时候,主应用可能通过名字 myApp-dataSource 引用数据源,将全部三个名字引用同一个对象,你可以将下面的别名定义添加到应用配置中:
<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />