Springboot中依賴注入的三種方式詳解
Springboot依賴注入Bean的方式
一、Field 注入/屬性注入
@Autowired注解的一大使用場景就是Field Injection。
@Controller
public class UserController {
@Autowired
private UserService userService;
}通過Java的反射機(jī)制實(shí)現(xiàn),所以private的成員也可以被注入具體的對象
優(yōu)點(diǎn)
- 代碼少,簡潔明了。
- 新增依賴十分方便,不需要修改原有代碼
缺點(diǎn)
- 容易出現(xiàn)空指針異常。Field 注入允許構(gòu)建對象實(shí)例時依賴的對象為空,導(dǎo)致空指針異常不能在啟動時就爆出來,只能在用到它時才發(fā)現(xiàn)。
空指針異常不是必現(xiàn)的,與bean的實(shí)例化順序有關(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)點(diǎn)
- 注入?yún)?shù)多的時候比較方便。構(gòu)造器注入?yún)?shù)太多了,顯得很笨重
- 能讓類在之后重新配置或者重新注入。
缺點(diǎn)
- 有一定風(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默認(rèn)會加載無參的構(gòu)造方法,Bean實(shí)例對象會為null
- Springboot官方建議使用final來修飾成員變量,然后通過構(gòu)造方法來進(jìn)行注入。原因:final修飾的成員變量是不能夠被修改的;不加final雖然也能注入Bean,但是若被其他人修改為null,可能會導(dǎo)致不必要的問題,所以最好是加final。
通過對象構(gòu)建的時候建立關(guān)系,這種方式對對象創(chuàng)建的順序會有要求,當(dāng)然Spring會為你搞定這樣的先后順序,除非你出現(xiàn)循環(huán)依賴,然后就會拋出異常。
Spring 4.x 的時候,Spring 官方在對比構(gòu)造器注入和 Setter 注入時,推薦使用構(gòu)造器注入方式:
優(yōu)點(diǎn)
- 保證注入的組件不可變
- 確保需要的依賴不為空
- 解決循環(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 注解是針對標(biāo)有 @NonNull 注解的變量和 final 變量進(jìn)行參數(shù)的構(gòu)造方法。
到此這篇關(guān)于Springboot中依賴注入的三種方式詳解的文章就介紹到這了,更多相關(guān)Springboot依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux中Elasticsearch的安裝詳細(xì)步驟
這篇文章主要介紹了Linux中Elasticsearch的安裝詳細(xì)步驟,Elasticsearch(ES)是一種分布式、可擴(kuò)展的搜索和分析引擎,基于Lucene構(gòu)建,它支持實(shí)時數(shù)據(jù)處理、全文搜索、實(shí)時分析等多種功能,需要的朋友可以參考下2024-12-12
Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下2021-03-03
詳解Spring Security如何在權(quán)限中使用通配符
小伙伴們知道,在Shiro中,默認(rèn)是支持權(quán)限通配符的。現(xiàn)在給用戶授權(quán)的時候,可以一個權(quán)限一個權(quán)限的配置,也可以直接用通配符。本文將介紹Spring Security如何在權(quán)限中使用通配符,需要的可以參考一下2022-06-06
Spring使用注解進(jìn)行引用類型的自動裝配逐步分析
自動裝配是springboot的核心,一般提到自動裝配就會和springboot聯(lián)系在一起。實(shí)際上Spring Framework早就實(shí)現(xiàn)了這個功能。Spring Boot只是在其基礎(chǔ)上,通過SPI的方式,做了進(jìn)一步優(yōu)化2023-03-03
在Mybatis中association標(biāo)簽多層嵌套的問題
這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊并訪問功能
zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊功能服務(wù)器的一個springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊并訪問,需要的朋友可以參考下2022-06-06
如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實(shí)體類
今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實(shí)體類展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06

