<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    使用 @Autowired 為什么會(huì)被 IDEA 警告,應(yīng)該怎么修改最佳?

    共 3384字,需瀏覽 7分鐘

     ·

    2023-04-18 06:10

    問題原因

    關(guān)于這個(gè)問題,其實(shí)答案相對(duì)統(tǒng)一,實(shí)際上用大白話說起來也容易理解。

    1.初始化問題

    先看一下Java初始化類的順序:

    父類的靜態(tài)字段 > 父類靜態(tài)代碼塊 > 子類靜態(tài)字段 > 子類靜態(tài)代碼塊 > 父類成員變量 > 父類構(gòu)造代碼塊 > 父類構(gòu)造器 > 子類成員變量 > 子類構(gòu)造代碼塊 > 子類構(gòu)造器

    而Autowired注入,則要排隊(duì)到子類構(gòu)造器以后了,SpringIOC并不會(huì)對(duì)依賴的bean是否為null做判斷,JVM編譯時(shí)同樣也不會(huì)有問題,但如果使用不當(dāng),運(yùn)行起來時(shí)或許會(huì)因?yàn)槌霈F(xiàn)空指針異常。

    2.對(duì)IOC容易依賴過強(qiáng)

    @Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn)。前者會(huì)警告,而后者不警告,就是因?yàn)榍罢邔?dǎo)致了應(yīng)用與框架的強(qiáng)綁定,若是換成其他IOC框架,則不能夠成功注入了。其實(shí)對(duì)于這方面,我認(rèn)為在大多數(shù)情況時(shí)是不會(huì)有什么問題的。

    3.其他方面

    我看到網(wǎng)絡(luò)上有一些其他方面的總結(jié),比如:依賴過多卻不夠明顯,違反了單一職責(zé)原則;不能像構(gòu)造器那樣注入不可變的對(duì)象等,這類問題需要結(jié)合個(gè)人實(shí)際開發(fā)進(jìn)行判斷。

    對(duì)于@Autowired使用方面,它雖然是將業(yè)務(wù)代碼和框架進(jìn)行了強(qiáng)綁定,但字段注入確實(shí)大幅簡(jiǎn)化了代碼。追求完完全全的松耦合其實(shí)也過于理想化,應(yīng)該在實(shí)際使用中追求平衡,否則將為了過度追求松耦合而得不償失。

    其他使用方式

    除了使用@Autowired以外,我們其實(shí)也有幾種好用的方式。使用@Resource替代@Autiwired方法是其中一種,只需要改變一個(gè)注解,這里就不展示了。

    1.set方法

          
          @RestController
    public?class?TestController2?{

    ????ITestService?testService;

    ????/*
    ?????*?基于set注入
    ?????*?*/

    ????@Autowired
    ????public?void?setTestService(ITestService?iTestService)?{
    ????????this.testService?=?iTestService;
    ????}

    ????@GetMapping("/status2")
    ????public?Result<?>?status()?{
    ????????return?testService.status();
    ????}
    }

    這種方法也使用了@Autowired注解,但是它是作用于成員變量的Setter函數(shù)上,而不是像Fied注入一樣作用于成員變量上。

    2.構(gòu)造器

          
          @RestController
    public?class?TestController1?{

    ????ITestService?testService;

    ????/*
    ????*?基于構(gòu)造方法的注入
    ????*?*/

    ????public?TestController1(ITestService?iTestService)?{
    ????????this.testService?=?iTestService;
    ????}

    ????@GetMapping("/status1")
    ????public?Result<?>?status()?{
    ????????return?testService.status();
    ????}
    }

    它的好處在于,采用了構(gòu)造方法注入,這種方式對(duì)對(duì)象創(chuàng)建的順序會(huì)有要求,它將避免循環(huán)依賴問題。是最可靠的方法。

    3.構(gòu)造器的簡(jiǎn)化版(推薦)

    首先,需要引入lombok依賴。

          
          <dependency>
    ????<groupId>org.projectlombok</groupId>
    ????<artifactId>lombok</artifactId>
    ????<version>1.18.2</version>
    </dependency>

    隨后,我們?cè)趧?chuàng)建時(shí)就可以使用@RequiredArgsConstructor注解,它將幫我們創(chuàng)建構(gòu)造器,final關(guān)鍵字必不可少。

          
          @RestController
    @RequiredArgsConstructor
    public?class?TestController3?{
    ????/*
    ?????*?用@RequiredArgsConstructor注解,這個(gè)使用方式也可以應(yīng)用于service層
    ?????*?*/

    ????private?final?ITestService?testService;


    ????@GetMapping("/status3")
    ????public?Result<?>?status()?{
    ????????return?testService.status();
    ????}
    }

    我們?cè)谑褂眠@些創(chuàng)建方法時(shí),都可以調(diào)出IDEA的結(jié)構(gòu)(Structure)面板進(jìn)行查看,如下圖所示。

    32efc8a14143710b5f7db4a5ab21009d.webp

    可以看到,在這個(gè)類中,已經(jīng)存在我們所需要注入的內(nèi)容。

    在網(wǎng)上有博主總結(jié)了一張表,但因?yàn)榈教幠芸吹?,不知原來出處是哪里?/p>

    81a75a0240ee62399dd5e47c0ab5851c.webp

    總結(jié)

    在使用中,使用構(gòu)造方法是比較可行的,加上lombok,其實(shí)也可以到達(dá)非常簡(jiǎn)便。

    作者:趙昕彧

    來源:blog.csdn.net/qq_40579464/article/

    details/129006885


    最近 熬夜給大家準(zhǔn)備了非常全的一套Java一線大廠面試題。全面覆蓋BATJ等一線互聯(lián)網(wǎng)公司的面試題及解答,由BAT一線互聯(lián)網(wǎng)公司大牛帶你深度剖析面試題背后的原理,不僅授你以魚,更授你以漁,為你面試掃除一切障礙。


    fda42a9e4d48e02066d6a1824f0b027b.webp

        



    資源,怎么領(lǐng)取?


    掃二維碼,加我微信,備注:面試題


    一定要備注:面試題,不要急哦,工作忙完后就會(huì)通過!



    瀏覽 65
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

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

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    深爱五月丁香 | 青娱乐激情 | 国产一a毛一级a毛片视频 | 最新欧美操逼 | 日韩特一级 |