7.3.2 Instantiating beans(实例化beans)

    bean定义本质上是建立一个或多个对象的配方.当询问时,容器会查看命名bean的配方,并使用由该bean定义封装的配置元数据建立(或获取)实际对象。若是您使用基于XML的配置元数据,您能够在<bean />元素的类属性中指定要实例化的对象的类型(或类)。这个类属性在内部是BeanDefinition实例上的一个Class属性,一般是必需的。(有关异常,请参见“实例化实例工厂方法”一节和第7.7节“Bean定义继承”一节。)您能够经过如下两种方式之一使用Class属性:java

    (1)一般,指定要在容器自己经过反复地调用其构造函数直接建立bean的状况下构造的bean类,这与使用new 操做符的Java代码至关。函数

    (2)要指定一个包含将要调用以建立对象的静态工厂方法的实际类,在容器调用类建立bean的静态工厂方法的状况较少的状况下。从调用静态工厂方法返回的对象类型可能彻底是同一个类或另外一个类。ui

实例化与构造函数this

    当经过构造函数方法建立一个bean时,全部普通类均可以使用并与Spring兼容。也就是说,正在开发的类不须要实现任何特定的接口或以特定方式编码。只需指定bean类便可。可是,根据特定bean使用的IoC类型,您可能须要一个默认(空)构造函数。编码

    Spring IoC容器几乎能够管理您想要管理的任何类;它不限于管理真正的JavaBeans.大多数Spring用户喜欢实际的JavaBean,只有默认(无参数)构造函数和容器中的属性以后创建适当的setter和getter。您还能够在容器中拥有更多异国情调的非Bean风格的类。​​​​​​​例如,若是您须要使用绝对不遵照JavaBean规范的旧版链接池,那么Spring也能够管理它。​​​​​​​spa

使用静态工厂方法实例化(Instantiation with a static factory method​​​​​​​)code

    定义使用静态工厂方法建立的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。

相关文章
相关标签/搜索