天天看點

Spring-Context之六:基于Setter方法進行依賴注入

上文講了基于構造器進行依賴注入,這裡講解基于Setter方法進行注入。在Java世界中有個約定(Convention),那就是屬性的設定和擷取的方法名一般是:set+屬性名(參數)及get+屬性名()的方式。boolean類型稍有不同,可以使用is+屬性名()方式來擷取。

以下是一個示例。

MessageHandler.java

使用Setter方法注入如下所示。

如果property的name為messageService,那麼必須在類中有個叫做<code>setMessageService</code>的方法,這樣才能完成注入。如果将MessageHandler.java中的<code>setMessageService</code>方法改為<code>setMessageService1</code>,那麼注入就會失敗,失敗message如下所示。

當然可以同時使用構造器注入和setter方法注入。

Person.java

bean定義如下:

要實作一個bean,即可以使用構造器注入,也可以使用setter注入,甚至可以在一個bean中綜合使用這兩種方式。那麼在真正開發中應該作何取舍那?一般來說,使用構造器注入的依賴必須是強制的依賴,而使用setter注入的依賴則是可選的依賴。使用構造器注入生成的對象是完全初始化了的,使用者可以直接拿來用,但是相比于setter方法而言使用者也就失去了定制化的能力。如果你發現構造器參數過多,那麼很可能說明該類承擔的職責過多,應該從設計解耦的角度對類的職責進行拆分。使用setter注入的對象好處是,使用者可以按需重新注入新的屬性。

另外在進行依賴注入時,可以将某些屬性抽出來成為一個元素,或者将元素内聯成為一個屬性。比如ref這個屬性。

它與以下xml配置完全等價。

value屬性也可以獨立為元素。

其等價于:

也可以顯式指定value的類型。

比如有一個屬性是個boolean值,如果想将其注入為true的話,不指定具體類型的話,Spring可能會将其作為字元串true對待。當然Spring會嘗試将傳入的字元串轉換為setter方法希望的類型,但這種自動轉換有時候并不是你期望的,這種情況下你就需要顯式指定其類型。