溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

javaspring使用構(gòu)造器注入的原因是什么

發(fā)布時(shí)間:2021-09-27 15:02:07 來(lái)源:億速云 閱讀:107 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)javaspring使用構(gòu)造器注入的原因是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一、前言

Spring框架對(duì)Java開(kāi)發(fā)的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反轉(zhuǎn))和AOP,平時(shí)使用最多的就是其中的IOC,我們通過(guò)將組件交由Spring的IOC容器管理,將對(duì)象的依賴關(guān)系由Spring控制,避免硬編碼所造成的過(guò)度程序耦合。

二、常見(jiàn)的三種注入方式

2.1 field注入

@Controllerpublic class FooController { @Autowired //@Inject private FooService fooService;  //簡(jiǎn)單的使用例子,下同 public List<Foo> listFoo() {   return fooService.list(); }}

這種注入方式應(yīng)該是筆者目前為止開(kāi)發(fā)中見(jiàn)到的最常見(jiàn)的注入方式。原因很簡(jiǎn)單:

注入方式非常簡(jiǎn)單:加入要注入的字段,附上@Autowired,即可完成。

使得整體代碼簡(jiǎn)潔明了,看起來(lái)美觀大方。

2.2 構(gòu)造器注入

@Controllerpublic class FooController {  private final FooService fooService;  @Autowired public FooController(FooService fooService) {   this.fooService = fooService; }  //使用方式上同,略}

在Spring4.x版本中推薦的注入方式就是這種,相較于上面的field注入方式而言,就顯得有點(diǎn)難看,特別是當(dāng)注入的依賴很多(5個(gè)以上)的時(shí)候,就會(huì)明顯的發(fā)現(xiàn)代碼顯得很臃腫

2.3 setter注入

@Controllerpublic class FooController {  private FooService fooService;  //使用方式上同,略 @Autowired public void setFooService(FooService fooService) {   this.fooService = fooService; }}

在Spring3.x剛推出的時(shí)候,推薦使用注入的就是這種,但是構(gòu)造器注入?yún)?shù)太多了,顯得很笨重,另外setter的方式能用讓類在之后重新配置或者重新注入。

三、構(gòu)造器注入的好處

這個(gè)構(gòu)造器注入的方式,能夠保證注入的組件不可變,并且確保需要的依賴不為空。此外,構(gòu)造器注入的依賴總是能夠在返回客戶端(組件)代碼的時(shí)候保證完全初始化的狀態(tài)

依賴不可變:其實(shí)說(shuō)的就是final關(guān)鍵字,這里不再多解釋了。不明白的園友可以回去看看Java語(yǔ)法。  依賴不為空(省去了我們對(duì)其檢查):當(dāng)要實(shí)例化FooController的時(shí)候,由于自己實(shí)現(xiàn)了有參數(shù)的構(gòu)造函數(shù),所以不會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),那么就需要Spring容器傳入所需要的參數(shù),所以就兩種情況:1、有該類型的參數(shù)->傳入,OK 。2:無(wú)該類型的參數(shù)->報(bào)錯(cuò)。所以保證不會(huì)為空,Spring總不至于傳一個(gè)null進(jìn)去吧 。  完全初始化的狀態(tài):這個(gè)可以跟上面的依賴不為空結(jié)合起來(lái),向構(gòu)造器傳參之前,要確保注入的內(nèi)容不為空,那么肯定要調(diào)用依賴組件的構(gòu)造方法完成實(shí)例化。而在Java類加載實(shí)例化的過(guò)程中,構(gòu)造方法是最后一步(之前如果有父類先初始化父類,然后自己的成員變量,最后才是構(gòu)造方法,這里不詳細(xì)展開(kāi))。所以返回來(lái)的都是初始化之后的狀態(tài)。

關(guān)于“javaspring使用構(gòu)造器注入的原因是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI