<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>

          @Autowired報錯的4種解決方案和原因分析!

          共 1934字,需瀏覽 4分鐘

           ·

          2021-07-06 11:54

          作者 | 王磊

          來源 | Java中文社群(ID:javacn666)

          轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

          上圖的報錯信息相信大部分程序員都遇到過,奇怪的是雖然代碼報錯,但絲毫不影響程序的正常執(zhí)行,也就是雖然編譯器 IDEA 報錯,但程序卻能正常的執(zhí)行,那這其中的原因又是為何?

          報錯原因分析

          報錯的原因首先是因為 IDEA 強大的報警機制,@Autowired 為 Spring 的注解,含義是將某類動態(tài)的注入到當(dāng)前類中,如下圖所示:



          @Autowired 默認是根據(jù) type 進行注入,并且注入時要求(注入)對象不能為 NULL,默認值如下圖所示:



          IDEA 報錯的原因是:@Autowired 為 Spring 的注解,而注入的 Mapper 對象使用的又是 @Mapper 的注解,然而 @Mapper 又為 MyBaits 的注解,IDEA 能很好的兼容并識別 Spring 的注解,但不能很好的識別 MyBatis 的注解,因此在使用 @Autowired 注解時,IDEA 并不能檢測到 @Mapper 注解的對象不為 NULL,因此就會報錯。



          這就是為什么使用 Spring 的注解 @Repository/@Component... 不報錯,而使用 @Mapper 注解卻會報錯的根本原因,如下圖所示:


          解決方案1:關(guān)閉報警機制

          關(guān)閉 IDEA 注入報警機制,可以避免報錯,實現(xiàn)步驟如下。

          1.打開 IDEA,找到參數(shù)設(shè)置選項 “Preferences...” ,如下圖所示:



          2.依次選擇 “Editor” -> “Inspections” -> “Spring” -> “Spring Core” -> “Code” -> “Autowiring for bean class” 將 “Error” 級別修改成 “Waring” 級別,如下圖所示:



          設(shè)置完成之后點擊確認,查看之前報錯的 Mapper 類,此時展示效果如下:



          報錯信息消失了。


          解決方案2:添加Spring注解

          在 Mapper 的類上添加 Spring 的注解,也可以解決 IDEA 報錯的問題,如 @Repository 或 @Component 這類注解,如下圖所示:



          或使用 @Repository 注解,如下圖所示:



          查看之前的報錯信息:



          報錯消失了。

          解決方案3:允許注入對象為NULL

          設(shè)置允許注入的 Mapper 對象為 NULL,也可以避免 IDEA 報錯,只需要設(shè)置 @Autowired(required=false) 即可,如下圖所示:



          (其中 userMapper2 對象就不報錯了)

          • @Autowired(required=true):表示當(dāng)使用 @Autowired 注解的時候,該 bean 必須存在,否則注入失敗,默認值。
          • @Autowired(required=false):表示忽略當(dāng)前要注入的 bean,如果有直接注入,沒有則跳過,不會報錯。

          @Autowired 默認值的實現(xiàn)源碼:


          解決方案4:使用@Resource注解

          使用 @Resource 注解替換 @Autowired 注解也可以避免報錯,它們的對比效果如下:



          @Resource 注解和 @Autowired 注解以當(dāng)前的場景來說,它們的主要區(qū)別是 @Resource 是 Java 自身提供的注解,而 @Autowired 是 Spring 提供的注解,@Autowired 默認值為 required=true,所以必須要一個非 NULL 的對象,當(dāng) IDEA 檢測不到對象為 NULL 時就會報錯,而 @Resource 并沒有這項要求。

          總結(jié)

          使用 @Autowired 注解導(dǎo)入 Mapper 對象報錯的原因,是因為 @Autowired 默認情況下,需要注入一個非 NULL 的對象,而被 @Mapper 修飾的類為 MyBatis 的注解,IDEA 并不能很好的識別其為非 NULL 對象,因此就會報錯。當(dāng)然,它的解決方案也有很多,推薦使用 @Resource 替代 @Autowired 注解的方式來解決此問題。

          更多 Spring 干貨,關(guān)注公眾號「Java中文社群」,實時獲取。


          往期推薦

          SpringBoot 中的 3 種條件裝配!


          SpringBoot 過濾器、攔截器、監(jiān)聽器對比及使用場景!


          Spring為什么建議構(gòu)造器注入?




          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  色操视频| 99热在线观看精品 | 中文字幕免费视频在线观看 | 成人Av影院三级片 | 亚洲精品色婷婷 |