spring-framework-中文文檔二:Bean概述

Spring IoC容器管理一個或多個bean這些bean是使用您提供給容器的配置元數據建立的,例如,以XML <bean/>定義的形式 html

在容器自己中,這些bean定義被表示爲 BeanDefinition對象,其中包含如下元數據(以及其餘信息):spring

  • 包限定的類名稱:一般是所定義的bean的實際實現類。ide

  • Bean行爲配置元素,它說明bean在容器中的行爲(範圍,生命週期回調等等)。函數

  • 引用bean爲其工做所需的其餘bean; 這些引用也稱爲 協做者或 依賴關係性能

  • 在新建立的對象中設置的其餘配置設置,例如,用於管理鏈接池的Bean的鏈接數量或池的大小限制。編碼

這個元數據轉化爲一組構成每一個bean定義的屬性。spa

表5.1。這個bean的定義code

屬性 在...中解釋
類 class

第5.3.2節「實例化bean」htm

name

第5.3.1節「命名bean」對象

範圍 scope

第5.5節「Bean範圍」

構造函數參數 constructor arguments

第5.4.1節「依賴注入」

性能 properties

第5.4.1節「依賴注入」

自動裝配模式 autowiring mode

第5.4.5節「自動裝配協做者」

延遲初始化模式 lazy-initialization mode

第5.4.4節「懶惰初始化bean」

初始化方法 initialization method

該部分稱爲「初始化回調」

銷燬方法 destruction method

該部分稱爲「銷燬回調」

除了包含有關如何建立特定bean的信息的bean定義外,這些 ApplicationContext實現還容許用戶註冊在容器外部建立的現有對象。這是經過getBeanFactory()返回BeanFactory實現 的方法訪問ApplicationContext的BeanFactory來完成的DefaultListableBeanFactory。 DefaultListableBeanFactory支持經過方法該登記registerSingleton(..)和 registerBeanDefinition(..)可是,典型的應用程序只能經過元數據bean定義來定義bean。

5.3.1命名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 和自動裝配協做者有關

在bean定義以外別名一個bean

在bean定義自己中,能夠經過使用最多由id屬性指定的一個名稱和屬性中任意數量的其餘名稱 的組合來爲bean提供多個名稱 name這些名稱能夠等同於同一個bean的別名,而且對於某些狀況頗有用,例如容許應用程序中的每一個組件經過使用特定於該組件自己的bean名稱來引用公共依賴項。

然而,指定bean實際定義的全部別名並不老是足夠的。有時候須要爲其餘地方定義的bean引入一個別名。在大型系統中,這種狀況一般是這種狀況,其中配置分佈在每一個子系統中,每一個子系統都有本身的一組對象定義。在基於XML的配置元數據中,您可使用該 <alias/>元素來完成此操做。

 
<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」 />

如今,每一個組件和主應用程序均可以經過一個惟一的名稱來引用dataSource,並保證不會與任何其餘定義衝突(有效地建立名稱空間),但它們引用同一個bean。

5.3.2實例化bean

bean定義本質上是建立一個或多個對象的配方。容器在被詢問時查看命名bean的配方,並使用由該bean定義封裝的配置元數據來建立(或獲取)實際對象。

若是使用基於XML的配置元數據,則能夠指定要在元素class屬性中 實例化的對象的類型(或類) <bean/>這個class 屬性在內部是Class一個BeanDefinition實例屬性,一般是強制性的。(有關例外狀況,請參閱「使用實例工廠方法實例化」第5.7節「Bean定義繼承」)。您能夠經過Class如下兩種方式之一使用該 屬性:

  • 一般,在容器自己經過反射調用其構造函數直接建立bean的狀況下,指定要構建的bean類,這與使用new操做符的Java代碼有些相同

  • 指定包含實際的類 static將被調用以建立該對象,在容器調用一個不常見的狀況工廠方法static工廠 的一類方法來建立bean。從調用static工廠方法返回的對象類型能夠是徹底相同的類或另外一個類。

用構造函數實例化

當您經過構造函數方法建立一個bean時,全部普通類均可以被Spring使用併兼容。也就是說,正在開發的類不須要實現任何特定的接口或以特定的方式編碼。只需指定bean類就足夠了。可是,根據您用於特定bean的IoC類型,您可能須要一個默認(空)構造函數。

Spring IoC容器幾乎能夠管理 任何您想要管理的類; 它不限於管理真正的JavaBeans。大多數Spring用戶更喜歡實際的JavaBeans,它只有一個默認的(無參數)構造函數,以及在容器中的屬性以後建模的合適的setter和getter。您也能夠在容器中使用更具異國情調的非Bean風格類。例如,若是您須要使用絕對不符合JavaBean規範的傳統鏈接池,Spring也能夠管理它。

使用基於XML的配置元數據,您能夠按以下方式指定您的bean類:

<bean  id = 「exampleBean」  class = 「examples.ExampleBean」 /> 

<bean  name = 「anotherExample」  class = 「examples.ExampleBeanTwo」 />

有關在構造對象後爲參數提供參數(若是須要)和設置對象實例屬性的機制的詳細信息,請參閱注入依賴項

使用靜態工廠方法實例化

在定義一個使用靜態工廠方法建立的bean時,可使用該class屬性來指定包含static工廠方法的類factory-method指定工廠方法自己的名稱的屬性您應該可以調用此方法(使用後面介紹的可選參數)並返回一個活動對象,隨後將其視爲經過構造函數建立的對象。這種bean定義的一個用途是static在舊代碼中調用 工廠。

如下bean定義指定將經過調用工廠方法來建立該bean。該定義沒有指定返回對象的類型(類),而只指定了包含工廠方法的類。在這個例子中,該 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; 
  } 
}

有關從工廠返回對象以後向工廠方法提供參數(可選)和設置對象實例屬性的機制的詳細信息,請參閱依賴關係和詳細配置

使用實例工廠方法實例化

與經過靜態工廠方法實例化相似,使用實例工廠方法的實例化從容器調用現有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,它將經過實例靜態 工廠方法建立對象。相反, FactoryBean(注意大寫字母)是指特定於Spring的。 FactoryBean

相關文章
相關標籤/搜索