Springboot中依賴注入的三種方式詳解
Springboot依賴注入Bean的方式
一、Field 注入/屬性注入
@Autowired注解的一大使用場景就是Field Injection。
@Controller public class UserController { @Autowired private UserService userService; }
通過Java的反射機制實現(xiàn),所以private的成員也可以被注入具體的對象
優(yōu)點
- 代碼少,簡潔明了。
- 新增依賴十分方便,不需要修改原有代碼
缺點
- 容易出現(xiàn)空指針異常。Field 注入允許構(gòu)建對象實例時依賴的對象為空,導(dǎo)致空指針異常不能在啟動時就爆出來,只能在用到它時才發(fā)現(xiàn)。
空指針異常不是必現(xiàn)的,與bean的實例化順序有關(guān)。有時,把依賴的bean改個名字就會報空指針異常。 - 會出現(xiàn)循環(huán)依賴的隱患。
二、set注入
Setter Injection需要依賴@Autowired注解,使用方式與Field Injection有所不同,F(xiàn)ield Injection時@Autowired是用在成員變量上,而Setter Injection的時候,@Autowired是用在成員變量的Setter函數(shù)上。
@Controller public class UserController { private UserService userService; @Autowired public void setUserService(UserService userService){ this.userService = userService; } }
通過調(diào)用成員變量的set方法來注入想要使用的依賴對象。
優(yōu)點
- 注入?yún)?shù)多的時候比較方便。構(gòu)造器注入?yún)?shù)太多了,顯得很笨重
- 能讓類在之后重新配置或者重新注入。
缺點
- 有一定風(fēng)險。set注入是后初始化其依賴對象,如果一個對象在沒有完全初始化就被外界使用是不安全的(尤其是在多線程場景下更加突出)。
三、構(gòu)造器注入
Constructor Injection是構(gòu)造器注入,是Springboot最為推薦的一種使用方式。
@Controller public class UserController { private final UserService userService; public UserController(UserService userService){ this.userService = userService; } }
注意:
- 不能提供無參構(gòu)造方法,否則Springboot默認會加載無參的構(gòu)造方法,Bean實例對象會為null
- Springboot官方建議使用final來修飾成員變量,然后通過構(gòu)造方法來進行注入。原因:final修飾的成員變量是不能夠被修改的;不加final雖然也能注入Bean,但是若被其他人修改為null,可能會導(dǎo)致不必要的問題,所以最好是加final。
通過對象構(gòu)建的時候建立關(guān)系,這種方式對對象創(chuàng)建的順序會有要求,當然Spring會為你搞定這樣的先后順序,除非你出現(xiàn)循環(huán)依賴,然后就會拋出異常。
Spring 4.x 的時候,Spring 官方在對比構(gòu)造器注入和 Setter 注入時,推薦使用構(gòu)造器注入方式:
優(yōu)點
- 保證注入的組件不可變
- 確保需要的依賴不為空
- 解決循環(huán)依賴的問題(若有循環(huán)依賴會在項目啟動時拋錯)
能夠保證注入的組件不可變,并且確保需要的依賴不為空。此外,構(gòu)造器注入的依賴總是能夠在返回客戶端(組件)代碼的時候保證完全初始化的狀態(tài)。
若手工寫構(gòu)造方法覺得麻煩,也可以使用lombok中的@RequiredArgsConstructor
@RequiredArgsConstructor public class VerifyController { private final UserService userService; private final StudentService studentService; }
@RequiredArgsConstructor
@RequiredArgsConstructor 注解是針對標有 @NonNull 注解的變量和 final 變量進行參數(shù)的構(gòu)造方法。
到此這篇關(guān)于Springboot中依賴注入的三種方式詳解的文章就介紹到這了,更多相關(guān)Springboot依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中==與equals()及hashcode()三者之間的關(guān)系詳解
最近也是在讀Hollis的《深入理解Java核心技術(shù)》里面一節(jié)講到了equals()和hashcode()的關(guān)系,對于這個高頻面試點,咱們需要認真理清一下幾者之間的關(guān)系2022-10-10全面解析Spring Security 過濾器鏈的機制和特性
這篇文章主要介紹了Spring Security 過濾器鏈的機制和特性,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07解決fcitx輸入法在IDEA中輸入法候選框無法跟隨光標移動的問題
這篇文章主要介紹了解決fcitx輸入法在Intellij IDEA開發(fā)工具中輸入法候選框無法跟隨光標移動的問題,代碼簡單易懂對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Spring?Boot整合?NoSQL?數(shù)據(jù)庫?Redis詳解
這篇文章主要為大家介紹了Spring?Boot整合?NoSQL?數(shù)據(jù)庫?Redis詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09