Spring注入:配置注入(set注入和構造器注入)與註解注入
注入簡介
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一個物件就行了,這種一般就用註解注入。
相關文章
- Spring set注入和構造注入的區別Spring
- Spring配置使用註解注入beanSpringBean
- Spring-註解注入Spring
- Spring配置注入Spring
- 【Spring實戰】—— 2 構造注入Spring
- Spring6框架中依賴注入的多種方式(推薦構造器注入)Spring框架依賴注入
- SQL 注入:聯合注入SQL
- sql注入之union注入SQL
- 程式注入之DLL注入
- Solon Ioc 的魔法之註解注入器(也可叫虛空注入器)
- spring使用註解注入bean理解SpringBean
- C++ DLL注入和程式碼注入C++
- sql注入之堆疊注入及waf繞過注入SQL
- 【Spring Boot】yaml配置注入Spring BootYAML
- 封神臺MYSQL 注入 - Dns注入MySqlDNS
- win10最強注入工具,遠端執行緒注入、訊息鉤子注入、輸入法注入、EIP注入、登錄檔注入、APC注入(APC好像不能用)Win10執行緒
- spring註解開發(一)Bean注入SpringBean
- Java開發學習(六)----DI依賴注入之setter及構造器注入解析Java依賴注入
- 封神臺Oracle注入- 報錯注入Oracle
- elasticsearch配置注入索引Elasticsearch索引
- Spring框架(一):配置&注入&監聽器Spring框架
- Spring系列.依賴注入配置Spring依賴注入
- .net core番外第2篇:Autofac的3種依賴注入方式(建構函式注入、屬性注入和方法注入),以及在過濾器裡面實現依賴注入依賴注入函式過濾器
- Spring系列第八講 依賴注入之手動注入Spring依賴注入
- Spring原始碼系列:依賴注入(三)-屬性注入Spring原始碼依賴注入
- sql注入之型別及提交注入SQL型別
- 反射、註解與依賴注入總結反射依賴注入
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- 聊聊依賴注入註解@Resource和@Autowired依賴注入
- dns注入DNS
- sql注入SQL
- php注入PHP
- quine注入UI
- SQL 注入SQL
- spring泛型注入Spring泛型
- Spring-注入方式Spring
- Spring(二)——注入物件Spring物件
- Spring依賴注入Spring依賴注入