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。

相關文章
相關標籤/搜索