Spring依賴(lài)注入,該放棄@Autowired注解了
最近在IDEA中用`@Autowired`注解時(shí),發(fā)現(xiàn)IDEA不推薦使用這個(gè)注解了。
原因是Spring官方不再推薦這種依賴(lài)注入的方式。具體原因不再詳細(xì)說(shuō)明。
目前,Spring官方推薦的注入方式是構(gòu)造器注入。構(gòu)造器注入的優(yōu)點(diǎn)如下:
優(yōu)點(diǎn):
明確依賴(lài)關(guān)系:使用構(gòu)造器注入可以強(qiáng)制要求所有必須的依賴(lài)項(xiàng)在創(chuàng)建對(duì)象時(shí)提供,這可以幫助開(kāi)發(fā)人員清晰地了解依賴(lài)項(xiàng)之間的關(guān)系。
可以保證對(duì)象不變性:通過(guò)將依賴(lài)項(xiàng)作為構(gòu)造器參數(shù)傳遞,可以確保創(chuàng)建的對(duì)象在實(shí)例化后不會(huì)被修改。這有助于提高代碼的可靠性和安全性。
易于測(cè)試:使用構(gòu)造器注入的對(duì)象更易于測(cè)試,因?yàn)樗鼈儾粫?huì)在運(yùn)行時(shí)自動(dòng)創(chuàng)建或重寫(xiě)依賴(lài)項(xiàng)。
避免循環(huán)依賴(lài):使用構(gòu)造器注入可以幫助避免循環(huán)依賴(lài)的問(wèn)題,因?yàn)閯?chuàng)建對(duì)象時(shí)所有必需的依賴(lài)項(xiàng)必須全部傳遞,而不是依賴(lài)項(xiàng)之間相互依賴(lài)。所以使用構(gòu)造器注入,存在循環(huán)依賴(lài)時(shí),會(huì)拋出異常。
但構(gòu)造器注入也存在缺點(diǎn),比如手寫(xiě)構(gòu)造器代碼會(huì)變成冗長(zhǎng)和繁瑣。可讀性變差。
解決方案:使用`@RequiredArgsConstructor` + `final`關(guān)鍵字的方式。
可以使用@RequiredArgsConstructor注解來(lái)自動(dòng)生成構(gòu)造器,并且通過(guò)使用final關(guān)鍵字來(lái)確保生成的構(gòu)造器參數(shù)是不可變的。這樣可以省去手動(dòng)編寫(xiě)構(gòu)造器的步驟,使代碼更加簡(jiǎn)潔。
使用@RequiredArgsConstructor注解時(shí),Spring會(huì)查找這個(gè)類(lèi)中未被注入的final或者@NonNull屬性,然后自動(dòng)生成一個(gè)構(gòu)造器,參數(shù)為這些屬性。如果這些屬性沒(méi)有設(shè)置初始值,那么生成的構(gòu)造器會(huì)要求在創(chuàng)建對(duì)象時(shí)傳入這些屬性的值
在上面的代碼中,MyService類(lèi)中的myDependency和message屬性被聲明為final,并且使用了@RequiredArgsConstructor注解。這樣,Spring會(huì)自動(dòng)生成一個(gè)構(gòu)造器,參數(shù)為MyDependency和String類(lèi)型的message屬性。