Spring注入:配置注入(set注入和構造器注入)與註解注入

Hack_Bug發表於2020-12-12

注入簡介

Spring注入可以理解為是對一個物件進行初始化,也就是省去new的這個步驟,類似於工廠模式一樣,通過一個工廠製造出這個物件,如果遇到修改,只需要改一處就行了。實現spring注入一般有兩種方法,配置檔案,或者用註解。各有不同的作用。

注意:本文中涉及到所以例子均預設加入了spring的包,如果沒有加入spring包可以自己百度一下用maven或者手動下載spring的依賴包(這裡就不給部落格了,還是應該自己動動手吧)

 

配置注入:

不重複造輪子,這裡已經說明得很清楚了,介紹了兩種方式,set注入和構造注入,並且都很詳細。至於這篇文中提及到的第三種:介面注入,本人小白觀點,應該用interface來注入,在用mybatis框架時一般會接觸到,注入這裡本人也不介紹這個了,因為涉及到mybatis另一個框架,比較複雜。

PS:這位作者寫的spring系列文章的確可以參考一下,本人也從中獲益良多。

http://blog.csdn.net/lishuangzhe7047/article/details/20740835 

 

註解注入:

自動裝配

在瞭解註解注入之前,需要先了解一下自動裝配這個概念,這篇部落格也說得比較詳細,可以先參考這個知道一些概念,由於這篇部落格沒有給出很詳細的例子,所以這裡本人會給個例子。

http://blog.csdn.net/lishuangzhe7047/article/details/20742427 

首先介紹一下檔案結構,Main主要來除錯執行,Bean其中一個物件,Test,Bean所依賴的一個物件(也就是Bean成員裡有Test物件),如圖:

Main.class

 

Bean.class

 

Test.class

 

這裡是配置檔案

 

從這裡可以看出,在bean那裡有一個autowrite,這個欄位就是用來自動裝配的。可以看見在<property>這個標籤中我沒有寫test的引用,這就是自動裝配,可以根據名字(byName),也可以根據型別(byType)。所以這裡的輸出如下

 

如果這裡我去掉了autowirte這個欄位,由於我也沒有在<property>裡面引用test,所以這裡的test會是空,並且會報錯,因為Bean裡面的test沒有被初始化,所以test裡面的getN呼叫不了,會NullPointer,如下圖所示。

 

 這裡,基於去掉autowrite的基礎上,我加一個<property>的test引用,這樣又變成了手動裝配了,就和上面給的第一篇部落格的做法一樣了。配置檔案如下

 

 所以其實自動裝配其實就是類A中有對類B的依賴關係(即A類的成員中B類的成員,記得這概念啊),然後可以通過自動註解初始化B類(但還是需要在配置檔案中寫B類的<bean>標籤的)

 

註解注入

瞭解了自動裝配,就可以瞭解一下註解注入,因為就是基於自動裝配這一概念的,不同的是註解注入不用在配置檔案中配置這麼多,只需要配置一點點就可以了,剩下的全部用註解來實現。

還是剛剛那個例子,把配置檔案改一下,去掉那些<bean>標籤,加一個這個標籤

 

其中base-package是自己的包名,如果有多個包名可以用分號隔開(分號在引號中)

然後再在目標類上面增加一些註解,如圖

Bean.class

 

僅僅在類上面加了個註解,這裡的註解其實也可以寫@Controller或者@Service,這些個註釋從注入效果來說沒有什麼區別,只是一些邏輯的不同,可以理解為一個變數可以這樣宣告int number,也可以這樣宣告int n,只是名字不同而已。然後在Test那個地方加了一個@Resource,其實也可以寫@Autowirte,不過官方貌似比較推薦些@Resource,其實兩個作用也是一樣的。這裡的@Resource就可以理解為是配置檔案中autowirte欄位,這裡的@Repository可以理解為配置檔案裡面的<bean>標籤。

 

Test.class

 

Main.class不變

然後這樣執行一下,如圖

 

發現Bean中的String 物件是null,int值是0,而test的int 也是0。這裡其實就是沒有給這些欄位初始化。但是Bean物件和Test是初始化了的(要追究到jvm的話就是Bean和Test都申請了一塊記憶體)。這裡也可以理解為呼叫了Bean和Test的預設建構函式,以為預設建構函式是空的,所以就是什麼都沒有初始化。這裡也可以自己重寫預設建構函式,例如把Test.class裡面的預設建構函式那段註釋去掉,然後執行結果如下:

 

這就是註解注入

 

配置注入VS註解注入

其實可以看出來,這兩種的本質其實就是呼叫了建構函式,不過配置注入中的set注入是在呼叫建構函式後從配置檔案裡面讀值然後set進去,構造注入是選擇了特定的建構函式進行構造。註解注入就是呼叫了預設建構函式。如果要在註解注入中初始化物件成員中的值(例如本例中Bean的String 物件的值),那就需要在預設建構函式中進行初始化。

選擇配置注入的好處

配置注入其實和工廠模式差不多,但選擇配置注入的好處在於可以把值和程式碼分開,方便管理,可以在配置檔案中賦值

選擇註解注入的好處

雖然註解注入又把註解和程式碼混在一起了,但是也可以方便把配置和類對應起來,而且配置比較簡單,寫個註解就行了。但是如果你要用註解配置初始化值,就只能在預設建構函式中寫。

所以一般常用的是,如果需要值的注入,一般用配置注入,例如資料庫連線類,就也可以在那裡初始化使用者名稱和密碼;如果是無具體值的類,例如只用方法的類,像那些controller和那些service,雖然裡面有一些物件,但這些物件不需要給什麼值,只要new一個物件就行了,這種一般就用註解注入。

相關文章