Spring依賴注入Dependency Injection的三種方式
Spring的依賴注入,我們一般使用@Autowired注解來完成,關(guān)于依賴注入一般有三種方式:
變量注入、構(gòu)造器注入、setter方法注入,下面我們仔細(xì)分析一下三種注入方式各自的特點(diǎn)以及使用場(chǎng)景。
一、變量注入(Field Injection)
先看看怎么使用:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; //... }
使用IDEA開發(fā)的時(shí)候,我們發(fā)現(xiàn)直接在變量上注解 @Autowired,它會(huì)有個(gè)警告提示:Field injection is not recommended。如下圖:
具體是:Field injection is not recommended
Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies"。
意思是說“變量依賴注入是不被建議的方式”。Spring官方建議“總是采用構(gòu)造器注入的方式建立依賴注入”。
優(yōu)點(diǎn):
- 注入方式簡(jiǎn)單,非常簡(jiǎn)潔,沒有任何多余代碼;
弊端:
- 注入對(duì)象不能用final修飾;
- 可能會(huì)導(dǎo)致循環(huán)依賴,啟動(dòng)的時(shí)候不會(huì)報(bào)錯(cuò),在使用那個(gè)bean的時(shí)候才會(huì)報(bào)錯(cuò);
- 對(duì)于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復(fù)用該實(shí)現(xiàn)類。而且將一直是個(gè)潛在的隱患,因?yàn)槟悴徽{(diào)用將一直無法發(fā)現(xiàn)NullPointException的存在;
二、構(gòu)造器注入(Constructor Injection)
先看看怎么使用:
@Service public class UserServiceImpl implements UserService { private final UserMapper userMapper; @Autowired public UserServiceImpl(UserMapper userMapper) { this.userMapper = userMapper; } }
優(yōu)點(diǎn):
- 顯式注明必須強(qiáng)制注入,通過強(qiáng)制指明依賴注入來保證這個(gè)類的運(yùn)行,防止NullPointerException;
- 注入對(duì)象可以使用final修飾;
- 非IOC容器環(huán)境也可使用new實(shí)例化該類的對(duì)象;
- 避免循環(huán)依賴,如果存在循環(huán)依賴,spring項(xiàng)目啟動(dòng)的時(shí)候就會(huì)報(bào)錯(cuò);
弊端:
- 當(dāng)你有十幾個(gè)甚至更多對(duì)象需要注入時(shí),構(gòu)造函數(shù)的代碼臃腫,看起來不太舒服;
使用 IEDA 可以在修改變量后重新使用快捷鍵生成構(gòu)造方法。
三、setter方法注入(Setter Injection)
先看看怎么使用:
@Service public class UserServiceImpl implements UserService { private UserMapper userMapper; @Autowired public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } }
優(yōu)點(diǎn):
- 依賴注入中使用的依賴是可選的,選擇依賴的意思是注入的依賴是可以為 NULL;
- 允許在類構(gòu)造完成后重新注入;
弊端:
- 注入對(duì)象不能使用final修飾;
四、使用場(chǎng)景
- 如果注入的屬性是必選的屬性,則通過構(gòu)造器注入;
- 如果注入的屬性是可選的屬性,則通過setter方法注入;
- 至于field注入,不建議使用;
到此這篇關(guān)于Spring依賴注入Dependency Injection的三種方式的文章就介紹到這了,更多相關(guān)Spring依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java語言自行實(shí)現(xiàn)ULID過程底層原理詳解
這篇文章主要為大家介紹了java語言自行實(shí)現(xiàn)ULID過程底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java 數(shù)組獲取最大和最小值的實(shí)例實(shí)現(xiàn)
這篇文章主要介紹了Java 數(shù)組獲取最大和最小值的實(shí)例實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09SpringBoot 動(dòng)態(tài)定時(shí)器的使用方法
這篇文章主要介紹了SpringBoot 動(dòng)態(tài)定時(shí)器的使用方法,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下2018-05-05Java的動(dòng)態(tài)代理模式之Cglib代理詳解
這篇文章主要介紹了Java的動(dòng)態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構(gòu)建一個(gè)子類對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能擴(kuò)展,?有些書也將Cglib代理歸屬到動(dòng)態(tài)代理,需要的朋友可以參考下2023-11-11java中File轉(zhuǎn)為MultipartFile的四種實(shí)現(xiàn)方式
這篇文章主要介紹了java中File轉(zhuǎn)為MultipartFile的四種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06深入淺出理解Java Lambda表達(dá)式之四大核心函數(shù)式的用法與范例
Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡(jiǎn)潔緊湊,今天小編帶你理解Lambda表達(dá)式之四大核心函數(shù)式的用法,感興趣的朋友快來看看吧2021-11-11