天天看點

Spring官方文檔學習-Bean概述

執行個體化Bean

bean defininition是建立bean的配方。當被請求時,容器按照名稱查找配方并使用該 bean definition封裝的中繼資料配置,建立一個實際的對象。

如果你使用基于XML的中繼資料配置,你會使用标簽的class屬性描述對象的類型,class屬性(Class是BeanDefinition的一個屬性)通常是強制的(除了使用Bean工廠方法的執行個體化和Bean定義的繼承方式進行執行個體化),你可以選擇以下兩種方式之一來使用Class屬性:

  • 通常的,容器本身通過反射的方式調用bean類的構造方法去構造一個bean對象,等同于使用new操作符構造一個對象;
  • 在比較少的情況下,對于包含一個靜态工廠方法的bean類的構造,容器會觸發一個靜态工廠方法去構造該bean。這個靜态工廠方法的傳回對象類型可能與該bean的class類型相同或者是另一個class.

内嵌類名稱 如果你想為一個内嵌類配置bean定義,你可以使用該内嵌類的二進制名稱或者源名稱。

例如,你有一個叫做SomeThing的類在com.example包中,SomeThing類中有一個叫做OtherThing的靜态内嵌類,此時名稱中可以使用

$或者.進行分隔,是以BeanDefinition中的Class屬性可以是com.example.SomeThing$OtherThing或者

com.example.SomeThing.OtherThing.

使用構造器進行執行個體化

當你使用構造器的方式去建立bean時,所有普通的類都可以被Spring使用并保持相容性。也就是說你開發的bean不需要實作特定的接口,也不需要使用特定的方式進行編碼。隻需要指定bean類就足夠了。然而,根據你的bean所使用的IOC容器的類型,你可能需要一個預設的(空的)構造函數。

Spring容器可以管理任何你希望它管理的類。并不局限于管理JavaBean,大多數Spring的使用者認為真正的JavaBean僅有一個無參數的構造器和一些根據容器中的屬性模組化的getter和setter,你的容器中可以定義更多非bean風格的外來類,例如你需要使用一個完全不符合JavaBean規範的連接配接池,Spring也可以對其進行很好的管理。

對于基于XML的中繼資料配置,你可以通過一下方式描述bean:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
           

對于有參數的構造函數以及對象被構造後進行屬性值的設定,可參考依賴注入一節。

使用靜态的工廠方法進行執行個體化

當定義了一個bean使用靜态工廠方法去建立時,使用class屬性去指定包含靜态工廠方法的類,然後再使用factory-method去指定工廠方法的名稱gai dz你應該能夠調用該方法(帶有可選參數的方法稍後再描述)傳回一個活動對象,該對象随後會被當作是通過構造函數建立的。這樣的BeanDefinition被稱之為靜态工廠。

下面的bean定義描述的是使用bean工廠進行建立的過程。定義中沒有指定傳回對象的類型,隻指出了工廠方法所在的類。在這個例子中,createInstance()方法必須是一個靜态方法,下面的例子說明了如何定義一個工廠方法。

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>
           

下面的例子描述了一個使用上述bean定義進行描述的類:

public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}
           

更多的關于含參bean工廠方法和工廠方法執行完成後設定對象屬性的原理,請參考依賴和配置一節。

使用執行個體工廠方法進行執行個體化

與使用靜态工廠方法進行執行個體化類似,使用執行個體工廠方法進行執行個體化時需要使用一個容器中已存在的bean對象的非靜态方法建立一個bean,使用這種機制時,不設定class屬性,在factory-bean屬性中指出目前(父容器或者祖先容器)bean容器中包含用于觸發對象建立的執行個體化方法的bean名稱,設定factory-name屬性為工廠方法的名稱。下面的例子展示了如何配置這樣一個bean:

<!-- 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"/>
           

在Spring文檔中,“factory bean”是指配置在Spring容器中的bean,用于執行個體或者靜态工廠方法建立對象時使用。相比之下,FactoryBean是指Spring中FactoryBean接口的實作類。

确定Bean的運作時類型

确定Bean的運作時類型非常重要。Bean中繼資料定義中指定的類型隻是一個初始類引用,也可能與聲明的工廠方法結合在一起,或者是一個FactoryBean類,它會生成不同的運作時類型,或者在執行個體級bean工廠方法下根本不設定。另外,AOP代理可以基于接口包裝bean執行個體,該代理限制對目标bean實際類型的暴露(僅公開其實作接口)。

找到特定bean類型的推薦方式是使用BeanFactory,指定bean名稱情況下的getType()方法調用。這将考慮上述所有情況,使用BeanFactory的getBean()方法傳入bean名稱傳回bean類型。

繼續閱讀