Spring IoC容器管理一个或多个bean。这些bean是使用您提供给容器的配置元数据建立的,例如,以XML <bean/>
定义的形式 。html
在容器自己中,这些bean定义被表示为 BeanDefinition
对象,其中包含如下元数据(以及其余信息):spring
包限定的类名称:一般是所定义的bean的实际实现类。ide
Bean行为配置元素,它说明bean在容器中的行为(范围,生命周期回调等等)。函数
引用bean为其工做所需的其余bean; 这些引用也称为 协做者或 依赖关系。性能
在新建立的对象中设置的其余配置设置,例如,用于管理链接池的Bean的链接数量或池的大小限制。编码
这个元数据转化为一组构成每一个bean定义的属性。spa
表5.1。这个bean的定义code
属性 | 在...中解释 |
---|---|
类 class | |
name | |
范围 scope |
|
构造函数参数 constructor arguments |
|
性能 properties |
|
自动装配模式 autowiring mode |
|
延迟初始化模式 lazy-initialization mode |
|
初始化方法 initialization method |
|
销毁方法 destruction method |
除了包含有关如何建立特定bean的信息的bean定义外,这些 ApplicationContext
实现还容许用户注册在容器外部建立的现有对象。这是经过getBeanFactory()
返回BeanFactory实现 的方法访问ApplicationContext的BeanFactory来完成的DefaultListableBeanFactory
。 DefaultListableBeanFactory
支持经过方法该登记registerSingleton(..)
和 registerBeanDefinition(..)
。可是,典型的应用程序只能经过元数据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 和自动装配协做者有关。
<alias name= “fromName” alias= “toName” />
在这种状况下,被命名的同一容器中的bean fromName
也能够在使用该别名定义以后被称为toName
。
例如,子系统A的配置元数据能够经过名称'subsystemA-dataSource引用数据源。子系统B的配置元数据能够经过名称'subsystemB-dataSource'引用数据源。在编写使用这两个子系统的主应用程序时,主应用程序经过名称“myApp-dataSource”引用数据源。要让全部三个名称都引用您添加到MyApp配置元数据中的同一对象,请使用如下别名定义:
<alias name = “subsystemA-dataSource” alias = “subsystemB-dataSource” /> <alias name = “subsystemA-dataSource” alias = “myApp-dataSource” />
bean定义本质上是建立一个或多个对象的配方。容器在被询问时查看命名bean的配方,并使用由该bean定义封装的配置元数据来建立(或获取)实际对象。
若是使用基于XML的配置元数据,则能够指定要在元素的class
属性中 实例化的对象的类型(或类) <bean/>
。这个class
属性在内部是Class
一个BeanDefinition
实例的属性,一般是强制性的。(有关例外状况,请参阅“使用实例工厂方法实例化”和第5.7节“Bean定义继承”)。您能够经过Class
如下两种方式之一使用该 属性:
当您经过构造函数方法建立一个bean时,全部普通类均可以被Spring使用并兼容。也就是说,正在开发的类不须要实现任何特定的接口或以特定的方式编码。只需指定bean类就足够了。可是,根据您用于特定bean的IoC类型,您可能须要一个默认(空)构造函数。
Spring IoC容器几乎能够管理 任何您想要管理的类; 它不限于管理真正的JavaBeans。大多数Spring用户更喜欢实际的JavaBeans,它只有一个默认的(无参数)构造函数,以及在容器中的属性以后建模的合适的setter和getter。您也能够在容器中使用更具异国情调的非Bean风格类。例如,若是您须要使用绝对不符合JavaBean规范的传统链接池,Spring也能够管理它。
<bean id = “exampleBean” class = “examples.ExampleBean” /> <bean name = “anotherExample” class = “examples.ExampleBeanTwo” />
有关在构造对象后为参数提供参数(若是须要)和设置对象实例属性的机制的详细信息,请参阅注入依赖项。
在定义一个使用静态工厂方法建立的bean时,可使用该class
属性来指定包含static
工厂方法的类和factory-method
指定工厂方法自己的名称的属性。您应该可以调用此方法(使用后面介绍的可选参数)并返回一个活动对象,随后将其视为经过构造函数建立的对象。这种bean定义的一个用途是static
在旧代码中调用 工厂。
如下bean定义指定将经过调用工厂方法来建立该bean。该定义没有指定返回对象的类型(类),而只指定了包含工厂方法的类。在这个例子中,该 createInstance()
方法必须是一个 静态方法。
public class ClientService { private static ClientService clientService = new ClientService(); private ClientService(){} public static ClientService createInstance(){ return clientService; } }
有关从工厂返回对象以后向工厂方法提供参数(可选)和设置对象实例属性的机制的详细信息,请参阅依赖关系和详细配置。
与经过静态工厂方法实例化相似,使用实例工厂方法的实例化从容器调用现有bean的非静态方法来建立新的bean。要使用此机制,请将该class
属性留空,并在factory-bean
属性中指定当前(或父/祖代)容器中的bean的名称,该容器包含要调用以建立对象的实例方法。使用factory-method
属性设置工厂方法自己的名称。
<! - factory bean,它包含一个名为createInstance()的方法 - > <bean id = “serviceLocator” class = “examples.DefaultServiceLocator” > <! - 注入此locator bean所需的任何依赖项 - > < / bean> <! - 要经过工厂bean建立的bean - > <bean id = “clientService” factory-bean = “serviceLocator” factory-method = “createClientServiceInstance” />
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator(){} public ClientService createClientServiceInstance(){ return clientService; } }
<bean ID = “serviceLocator” class = “examples.DefaultServiceLocator” > <! -经过注入此定位器bean所需的任何依赖关系- > </bean> <bean ID = “clientService” factory-bean= “serviceLocator” factory-method = “createClientServiceInstance” /> <bean id = “accountService” factory-bean = “serviceLocator” factory-method = “createAccountServiceInstance” />
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private static AccountService accountService = new AccountServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } public AccountService createAccountServiceInstance() { return accountService; } }
这种方法代表,工厂bean自己能够经过依赖注入(DI)进行管理和配置。详细信息请参阅依赖关系和配置。
![]() |
在Spring文档中,工厂bean 指的是在Spring容器中配置的bean,它将经过实例或静态 工厂方法建立对象。相反, |