通過例項瞭解java spring使用構造器注入的原因
阿新 • • 發佈:2020-01-07
這篇文章主要介紹了通過例項瞭解spring使用構造器注入的原因,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一、前言
Spring框架對Java開發的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反轉)和AOP,平時使用最多的就是其中的IOC,我們通過將元件交由Spring的IOC容器管理,將物件的依賴關係由Spring控制,避免硬編碼所造成的過度程式耦合。
二、常見的三種注入方式
2.1 field注入
@Controller public class FooController { @Autowired //@Inject private FooService fooService; //簡單的使用例子,下同 public List<Foo> listFoo() { return fooService.list(); } }
這種注入方式應該是筆者目前為止開發中見到的最常見的注入方式。原因很簡單:
注入方式非常簡單:加入要注入的欄位,附上@Autowired,即可完成。
使得整體程式碼簡潔明瞭,看起來美觀大方。
2.2 構造器注入
@Controller public class FooController { private final FooService fooService; @Autowired public FooController(FooService fooService) { this.fooService = fooService; } //使用方式上同,略 }
在Spring4.x版本中推薦的注入方式就是這種,相較於上面的field注入方式而言,就顯得有點難看,特別是當注入的依賴很多(5個以上)的時候,就會明顯的發現程式碼顯得很臃腫
2.3 setter注入
@Controller public class FooController { private FooService fooService; //使用方式上同,略 @Autowired public void setFooService(FooService fooService) { this.fooService = fooService; } }
在Spring3.x剛推出的時候,推薦使用注入的就是這種,但是構造器注入引數太多了,顯得很笨重,另外setter的方式能用讓類在之後重新配置或者重新注入。
三、構造器注入的好處
這個構造器注入的方式,能夠保證注入的元件不可變,並且確保需要的依賴不為空。此外,構造器注入的依賴總是能夠在返回客戶端(元件)程式碼的時候保證完全初始化的狀態
- 依賴不可變:其實說的就是final關鍵字,這裡不再多解釋了。不明白的園友可以回去看看Java語法。
- 依賴不為空(省去了我們對其檢查):當要例項化FooController的時候,由於自己實現了有引數的建構函式,所以不會呼叫預設建構函式,那麼就需要Spring容器傳入所需要的引數,所以就兩種情況:1、有該型別的引數->傳入,OK 。2:無該型別的引數->報錯。所以保證不會為空,Spring總不至於傳一個null進去吧 。
- 完全初始化的狀態:這個可以跟上面的依賴不為空結合起來,向構造器傳參之前,要確保注入的內容不為空,那麼肯定要呼叫依賴元件的構造方法完成例項化。而在Java類載入例項化的過程中,構造方法是最後一步(之前如果有父類先初始化父類,然後自己的成員變數,最後才是構造方法,這裡不詳細展開)。所以返回來的都是初始化之後的狀態。
四、總結
使用構造器注入的好處:
- 保證依賴不可變(final關鍵字)
- 保證依賴不為空(省去了我們對其檢查)
- 保證返回客戶端(呼叫)的程式碼的時候是完全初始化的狀態
- 避免了迴圈依賴
- 提升了程式碼的可複用性
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。