天天看點

《Spring MVC學習指南(第2版)》——1.2 Spring控制反轉容器的使用

本節書摘來自異步社群《spring mvc學習指南(第2版)》一書中的第1章,第1.2節,作者:【美】paul deck著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

本節主要介紹spring如何管理bean和依賴關系。

1.2.1 通過構造器建立一個bean執行個體

前面已經介紹,通過調用applicationcontext的getbean方法可以擷取一個bean的執行個體。下面的配置檔案中定義了一個名為product的bean(見清單1.1)。

清單1.1 一個簡單的配置檔案

該bean的定義告訴spring,通過預設無參的構造器來初始化product類。如果不存在該構造器(如果類的編寫者重載了構造器,且沒有顯示聲明預設構造器),則spring将抛出一個異常。此外,該無參數的構造器并不要求是public簽名。

注意,應采用id或者name屬性辨別一個bean。為了讓spring建立一個product執行個體,應将bean定義的name值“product”(具體實踐中也可以是id值)和product類型作為參數傳遞給applicationcontext的getbean方法。

1.2.2 通過工廠方法建立一個bean執行個體

大部分類可以通過構造器來執行個體化。然而,spring還同樣支援通過調用一個工廠的方法來初始化類。

下面的bean定義展示了通過工廠方法來執行個體化java.time.localdate。

本例中采用了id屬性而非name屬性來辨別bean,采用了getbean方法來擷取localdate 執行個體。

1.2.3 銷毀方法的使用

有時,我們希望一些類在被銷毀前能執行一些方法。spring考慮到了這樣的需求。可以在bean定義中配置destroy-method屬性,來指定在銷毀前要執行的方法。

下面的例子中,我們配置spring通過java.util.concurrent.executors的靜态方法newcached threadpool來建立一個java.uitl.concurrent.executorservice執行個體,并指定了destroy-method屬性值為shutdown方法。這樣,spring會在銷毀executorservice執行個體前調用其shutdown方法。

1.2.4 向構造器傳遞參數

spring支援通過帶參數的構造器來初始化類(見清單1.2)。

清單1.2 product類

以下的定義展示了如何通過參數名傳遞參數。

除了通過名稱傳遞參數外,spring還支援通過指數方式來傳遞參數,具體如下:

需要說明的是,采用這種方式,對應構造器的所有參數必須傳遞,缺一不可。

1.2.5 setter方式依賴注入

下面以employee類和address類為例,介紹setter方式依賴注入(見清單1.3和清單1.4)。

清單1.3 employee類

清單1.4 address類

employee依賴于address類,可以通過如下配置來保證每個employee執行個體都能包含address執行個體。

simpleaddress對象是address類的一個執行個體,它通過構造器方式執行個體化。employee1對象則通過配置property元素來調用setter方法以設定值。需要注意的是,homeaddress屬性配置的是simpleaddress對象的引用。

被引用對象的配置定義無需早于引用其對象的定義。在本例中,employee1對象可以出現在simpleaddress對象定義之前。

1.2.6 構造器方式依賴注入

清單1.3所示的employee類提供了一個可以傳遞參數的構造器,我們還可以将address對象通過構造器注入,如下所示: