<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:為什么 Spring 和 IDEA 都不推薦使用 @Autowired 注解??

          共 2526字,需瀏覽 6分鐘

           ·

          2022-09-20 22:06

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨 及時(shí)送達(dá) e6b36306413f13b58df03adad58e87f0.webp

          作者:小亮哥Ya
          鏈接:https://juejin.cn/post/7080441168462348319

          大家在使用IDEA開(kāi)發(fā)的時(shí)候有沒(méi)有注意到過(guò)一個(gè)提示,在字段上使用Spring的依賴注入注解@Autowired后會(huì)出現(xiàn)如下警告:

          Field injection is not recommended (字段注入是不被推薦的)

          但是使用@Resource卻不會(huì)出現(xiàn)此提示

          網(wǎng)上文章大部分都是介紹兩者的區(qū)別,沒(méi)有提到為什么,當(dāng)時(shí)想了好久想出了可能的原因,今天來(lái)總結(jié)一下。另外,最新?Spring?面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。

          Spring常見(jiàn)的DI方式

          • 構(gòu)造器注入:利用構(gòu)造方法的參數(shù)注入依賴
          • Setter注入:調(diào)用Setter的方法注入依賴
          • 字段注入:在字段上使用@Autowired/Resource注解

          推薦一個(gè)開(kāi)源免費(fèi)的 Spring Boot 最全教程:

          https://github.com/javastacks/spring-boot-best-practice

          @Autowired VS @Resource

          事實(shí)上,他們的基本功能都是通過(guò)注解實(shí)現(xiàn)依賴注入,只不過(guò)@AutowiredSpring定義的,而@ResourceJSR-250定義的。

          • 依賴識(shí)別方式:@Autowired默認(rèn)是byType可以使用@Qualifier指定Name,@Resource默認(rèn)ByName如果找不到則ByType
          • 適用對(duì)象:@Autowired可以對(duì)構(gòu)造器、方法、參數(shù)、字段使用,@Resource只能對(duì)方法、字段使用
          • 提供方:@Autowired是Spring提供的,@Resource是JSR-250提供的

          各種DI方式的優(yōu)缺點(diǎn)

          參考Spring官方文檔,建議了如下的使用場(chǎng)景:

          • 構(gòu)造器注入強(qiáng)依賴性(即必須使用此依賴),不變性(各依賴不會(huì)經(jīng)常變動(dòng))
          • Setter注入可選(沒(méi)有此依賴也可以工作),可變(依賴會(huì)經(jīng)常變動(dòng))
          • Field注入:大多數(shù)情況下盡量少使用字段注入,一定要使用的話, @Resource相對(duì)@Autowired對(duì)IoC容器的耦合更低

          Field注入的缺點(diǎn)

          • 不能像構(gòu)造器那樣注入不可變的對(duì)象
          • 依賴對(duì)外部不可見(jiàn),外界可以看到構(gòu)造器和setter,但無(wú)法看到私有字段,自然無(wú)法了解所需依賴
          • 會(huì)導(dǎo)致組件與IoC容器緊耦合(這是最重要的原因,離開(kāi)了IoC容器去使用組件,在注入依賴時(shí)就會(huì)十分困難)
          • 導(dǎo)致單元測(cè)試也必須使用IoC容器,原因同上
          • 依賴過(guò)多時(shí)不夠明顯,比如我需要10個(gè)依賴,用構(gòu)造器注入就會(huì)顯得龐大,這時(shí)候應(yīng)該考慮一下此組件是不是違反了單一職責(zé)原則

          為什么IDEA只對(duì)@Autowired警告

          Field注入雖然有很多缺點(diǎn),但它的好處也不可忽略:那就是太方便了。使用構(gòu)造器或者setter注入需要寫更多業(yè)務(wù)無(wú)關(guān)的代碼,十分麻煩,而字段注入大幅簡(jiǎn)化了它們。并且絕大多數(shù)情況下業(yè)務(wù)代碼和框架就是強(qiáng)綁定的,完全松耦合只是一件理想上的事,犧牲了敏捷度去過(guò)度追求松耦合反而得不償失。

          那么問(wèn)題來(lái)了,為什么IDEA只對(duì)@Autowired警告,卻對(duì)@Resource視而不見(jiàn)呢?另外,最新 Spring 面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。

          個(gè)人認(rèn)為,就像我們前面提到過(guò)的:@AutowiredSpring提供的,它是特定IoC提供的特定注解,這就導(dǎo)致了應(yīng)用與框架的強(qiáng)綁定,一旦換用了其他的IoC框架,是不能夠支持注入的。

          @ResourceJSR-250提供的,它是Java標(biāo)準(zhǔn),我們使用的IoC容器應(yīng)當(dāng)去兼容它,這樣即使更換容器,也可以正常工作。

          End


          Spring Boot 學(xué)習(xí)筆記,這個(gè)太全了!

          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)

          Nacos 2.1.1 正式發(fā)布,真心強(qiáng)!

          Spring Cloud Alibaba 最新重磅發(fā)布!

          面試通過(guò),背調(diào)涼了。。

          f72f354fdd62b58012a1ce42d90587ce.webpSpring Cloud 微服務(wù)最新課程!
          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久91精品成人片 | 想要xx.mp4 | 久久久夜色| 免费A片在线播放 | 国产第一草草影院 |