日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Spring选择哪种注入方式

發(fā)布時(shí)間:2025/1/21 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring选择哪种注入方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Spring常見的注入方式

1.1 Field注入

field即在變量上直接使用注解進(jìn)行注入,內(nèi)部使用反射的方式實(shí)現(xiàn)注入到field中。

  • 優(yōu)點(diǎn):代碼簡(jiǎn)潔有效,最為開發(fā)人員喜歡使用
  • 缺點(diǎn):依賴對(duì)象可能為null而報(bào)空指針異常,容易出現(xiàn)循環(huán)依賴問題
@Autowiredprivate GoodsCategoryService goodsCategoryService;

1.2 setter注入

spring 3.x版本中推薦使用的注入方式,通過在set方法上使用注解完成對(duì)象注入。

  • 優(yōu)點(diǎn):選擇性注入,可有可無,依賴不會(huì)影響整個(gè)項(xiàng)目運(yùn)行
  • 缺點(diǎn):在對(duì)象實(shí)例化后,依賴信息依然可以通過set方法修改,不太好
private GoodsCategoryService goodsCategoryService;@Autowiredpublic setGoodsCategoryService(GoodsCategoryService goodsCategoryService){this.goodsCategoryService = goodsCategoryService;} ? ?

1.3 構(gòu)造器注入

spring 4.x版本時(shí)Spring團(tuán)隊(duì)推薦使用的注入方式,將注解標(biāo)注在構(gòu)造函數(shù)上,對(duì)象以參數(shù)的形式傳遞,在構(gòu)造函數(shù)中完成注入對(duì)象的初始化。

  • 優(yōu)點(diǎn):變量定義使用強(qiáng)制性的顯式注入(final關(guān)鍵字保證不可變)、避免空指針和循環(huán)依賴,
  • 缺點(diǎn):在需要注入的依賴較多時(shí),使用構(gòu)造方法臃腫
private final GoodsCategoryService goodsCategoryService; @Autowired public GoodServiceImpl(GoodsCategoryService goodsCategoryService){this.goodsCategoryService = goodsCategoryService; }

2. Spring為什么推薦使用構(gòu)造器注入

Field注入盡管代碼上簡(jiǎn)潔有效,但是會(huì)帶來一些問題:

  • 對(duì)于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復(fù)用該實(shí)現(xiàn)類
  • 不調(diào)用依賴bean時(shí),不會(huì)發(fā)現(xiàn)空指針的異常,在運(yùn)行時(shí)調(diào)用會(huì)報(bào)異常
  • 使用field注入可能會(huì)導(dǎo)致循環(huán)依賴,即A里面注入B,B里面又注入A
  • 會(huì)造成依賴臃腫,職責(zé)過多,使用Filed注入時(shí),添加數(shù)量不受限制(沒有警告),可能會(huì)注入過多的依賴項(xiàng),違反了單一職責(zé)原則。
  • Setter方法注入是Spring 3.x版本推薦的注入方式,因?yàn)?strong>setter的方式能用讓類在之后重新配置或者重新注入,但是

    • 寫起來比較麻煩,每個(gè)依賴都需要一個(gè)set方法
    • 可以重新配置或注入雖然方便,但是有些依賴需要不可變,使用此種方式產(chǎn)生不確定性

    構(gòu)造器注入是Spring 4.x 版本推薦的注入方式,主要優(yōu)點(diǎn)有:

  • 依賴不可變,使用final定義,保證注入后的不可變
  • 依賴不為null,使用構(gòu)造函數(shù)傳參的方式,在實(shí)例化對(duì)象傳參時(shí)如果參數(shù)為null,則報(bào)錯(cuò),提前避免了空指針異常
  • 在傳參時(shí)傳入的是依賴對(duì)象,而該對(duì)象傳入時(shí)會(huì)保證對(duì)象類已經(jīng)完成了初始化,也同時(shí)保證了對(duì)象不為null
  • 如果構(gòu)造器注入時(shí)發(fā)生了循環(huán)依賴,在項(xiàng)目啟動(dòng)時(shí)就會(huì)報(bào)錯(cuò)BeanCurrentlyInCreationException,而Field注入只有在使用時(shí)才會(huì)報(bào)錯(cuò)
  • 3. @Autowired、@Resource和@Inject的區(qū)別

    3.1 @Autowired

    • @Autowired注解是Spring2.5之后帶入的注解,通過AutowiredAnnotationBeanPostProcessor類實(shí)現(xiàn)注入
    • @Autowired可以標(biāo)注在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE之上
    • @Autowired默認(rèn)根據(jù)bean類型進(jìn)行自動(dòng)裝配,byType
    • @Autowired注入時(shí)如果發(fā)現(xiàn)同類型有多個(gè)bean,此時(shí)需要使用@Qualifier注解來指定bean的name,即byName
    • @Autowired注解有屬性required,默認(rèn)為true,設(shè)置為false則表示未找到對(duì)應(yīng)bean時(shí)不拋出異常

    3.2 @Resource

    • @Resource時(shí)javax.annotation包下的注解
    • @Resource可以標(biāo)注在TYPE, FIELD, METHOD之上
    • @Resource是根據(jù)屬性名稱進(jìn)行自動(dòng)裝配的,其擁有屬性name,可以根據(jù)屬性值指定裝配bean的name

    3.3 @Inject

    @Inject注解需要導(dǎo)入javax.inject.Inject包,能實(shí)現(xiàn)注入 @Inject可以標(biāo)注在CONSTRUCTOR、METHOD、FIELD之上 @Inject注解是根據(jù)類型自動(dòng)裝配的,如果需要指定名稱,則需要配合@Named注解

    4. 總結(jié)

    盡管Spring 4.x 推薦使用構(gòu)造器注入,但是我們?nèi)匀豢梢允褂闷渌绞?#xff0c;且可以使用混合方式注入

    • 不可變的注入使用構(gòu)造器
    • 可變可選注入使用setter方法
    • 對(duì)于多實(shí)現(xiàn)的依賴注入時(shí),可以使用Filed注入或者setter方法來指定注入的實(shí)現(xiàn)
    • 實(shí)際使用Field注入的仍然很多,大部分是一些遺留問題,后續(xù)新項(xiàng)目可以嘗試盡量避免Field注入

    總結(jié)

    以上是生活随笔為你收集整理的Spring选择哪种注入方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。