bean定义本质上是创建一个或多个对象的配方.当询问时,容器会查看命名bean的配方,并使用由该bean定义封装的配置元数据创建(或获取)实际对象。如果您使用基于XML的配置元数据,您可以在<bean />元素的类属性中指定要实例化的对象的类型(或类)。这个类属性在内部是BeanDefinition实例上的一个Class属性,通常是必需的。(有关异常,请参见“实例化实例工厂方法”一节和第7.7节“Bean定义继承”一节。)您可以通过以下两种方式之一使用Class属性:
(1)通常,指定要在容器本身通过反复地调用其构造函数直接创建bean的情况下构造的bean类,这与使用new 操作符的Java代码相当。
(2)要指定一个包含将要调用以创建对象的静态工厂方法的实际类,在容器调用类创建bean的静态工厂方法的情况较少的情况下。从调用静态工厂方法返回的对象类型可能完全是同一个类或另一个类。
实例化与构造函数
当通过构造函数方法创建一个bean时,所有普通类都可以使用并与Spring兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定方式编码。只需指定bean类即可。但是,根据特定bean使用的IoC类型,您可能需要一个默认(空)构造函数。
Spring IoC容器几乎可以管理您想要管理的任何类;它不限于管理真正的JavaBeans.大多数Spring用户喜欢实际的JavaBean,只有默认(无参数)构造函数和容器中的属性之后建立适当的setter和getter。您还可以在容器中拥有更多异国情调的非Bean风格的类。例如,如果您需要使用绝对不遵守JavaBean规范的旧版连接池,那么Spring也可以管理它。
使用静态工厂方法实例化(Instantiation with a static factory method)
定义使用静态工厂方法创建的bean时,您可以使用class属性指定包含静态工厂方法的类和名为factory-method的属性,以指定工厂方法本身的名称。您应该可以调用此方法(随后可以使用可选参数),并返回一个活动对象,随后将其视为通过构造函数创建的对象。这种bean定义的一个用途是在旧代码中调用静态工厂。
以下bean定义指定将通过调用工厂方法创建该bean。定义没有指定返回对象的类型(class),只指定了包含工厂方法的类。在这个例子中,createInstance()方法必须是静态方法。
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
有关从工厂方法提供(可选)参数的机制以及从工厂返回对象后设置对象实例属性的详细信息,请参阅依赖关系和配置。
实例化使用实例工厂方法(Instantiation using an instance factory method)
与通过静态工厂方法的实例化类似,使用实例工厂方法实例化从容器调用现有bean的非静态方法来创建新bean。要使用此机制,请将类属性保留为空,并在 factory-bean 属性中指定包含要调用以创建对象的实例方法的当前(或parent/ancestor(父/祖先))容器中的bean的名称。使用 factory-method 属性设置工厂方法本身的名称。
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory 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">
<!-- inject any dependencies required by this locator 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;
}
}
note:
在Spring文档中,工厂bean(factory bean )是指通过实例或静态工厂方法创建对象的Spring容器中配置的bean。FactoryBean(注意大写)是指Spring特定的FactoryBean。