@autowired注解注入為null_Intellij IDEA中Mybatis Mapper自動注入警告的6種解決方案

相信使用Mybaits的小伙伴們一定會經常編寫類似如下的代碼:

47cc4888b1093bc37003a23110b5fcfb.png

可以看到 userMapper 下有個紅色警告。雖然代碼本身并沒有問題,能正常運行,但有個警告總歸有點惡心。本文分析原因,并列出解決該警告的幾種方案。

原因

眾所周知,IDEA是非常智能的,它可以理解Spring的上下文。然而 UserMapper 這個接口是Mybatis的,IDEA理解不了。

@Autowired 注解,默認情況下要求依賴對象(也就是 userMapper )必須存在。而IDEA認為這個對象的實例/代理是個null,所以就友好地給個提示

解決方案

方法1:為 @Autowired 注解設置required = false

使用 @Autowired 注解時,若希望允許null值,可設置required = false,像這樣:

@Autowired(required = false) private UserMapper userMapper;

這樣就不會有警告了。原因很好理解:IDEA認為userMapper是個null,給了警告;加上required = false后,使用 @Autowired 注解不再去校驗userMapper是否存在了。也就不會有警告了。

總結:這種方式有點蛋疼。一個龐大的既有項目,可能到處都在引用Mapper,總不能到處都補上 required = false 吧……而且對于新手/新員工,很難一眼看懂加required = false屬性只是為了解決IDEA的警告。

方法2:用 @Resource 替換 @Autowired

像這樣:

@Resource private UserMapper userMapper;

這樣也不會再有討厭的警告。如果你對原因感興趣,不妨了解一下《@Autowired 與@Resource的區別》

總結:這種方式挺贊,但如果一個項目已經大量使用@Autowired,然后為了個警告到處改成@Resource,也有點蛋疼。

方法3:在Mapper接口上加上@Repository注解

像這樣:

@Repository public interface UserMapper extends Mapper<User> { }

這樣也能讓你的

@Autowired private UserMapper userMapper;

不再報錯。

當然,如果你用@Component替換@Repository也是可以的。原理大致:IDEA不是認為 userMapper 是個null嘛…加個@Repository注解騙一下IDEA就OK了……

總結:這種方式比較贊,改動小,也簡單,我比較喜歡。

方法4:用Lombok

像這樣:

@Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class TestService { private final UserMapper userMapper; ... }

Lombok生成的代碼是這樣的:

@Service public class TestService { private final UserMapper userMapper; @Autowired public TestService(final UserMapper userMapper) { this.userMapper = userMapper; } ... }

但如果自己手寫成Lombok生成的代碼,IDEA依然會給你報警告 。我猜,應該是IDEA的Lombok插件把IDEA搞懵逼了…所以不提示了…

總結這是我目前最喜歡的方式。原因有2:

  • Spring官方并不建議直接在類的field上使用@Autowired注解,原因詳見:《Why field injection is evil》 ,用本方法可將field注入編程構造方法注入,Spring是比較推薦的。
  • 體現了Lombok的優勢,簡化了你的代碼。而且你也不用在每個field上都加上@Autowired注解了。

不過這種方式也有缺點:那就是如果你類之間的依賴關系比較復雜,特別是存在循環依賴(A引用B,B引用A,或者間接的循環引用)時,應用將會啟動不起來……這其實是構造方法注入方式的缺點

方法5:把IDEA的警告關閉掉

個人沒試過,也沒有動力去試。沒有提示的IDEA是沒有靈魂的,我從來不去修改IDEA的任何警告設置。

方法6:安裝mybatis plugin

安裝mybatis plugin即可解決該問題。

總結

以上是解決問題的6種方法。問題本身其實比較簡單,但其實隱藏的知識點其實挺多的,例如:

  • @Autowired和@Resource有什么區別
  • 為什么Spring不建議使用field方式注入
  • @Repository、@Componnt、@Controller、@Service有什么區別

總之,硬貨有時候就隱藏在很low的問題之下,哈哈哈。

參考文檔

  • 剔除Intellij中Mybatis的Mapper自動注入警告
  • idea mybatis 注入 mapper 提示錯誤

作者:大目

鏈接:http://www.imooc.com/article/287865

來源:慕課網

本文原創發布于慕課網 ,轉載請注明出處,謝謝合作

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五 Python之socket網絡編程

<1>socket概念 socket通常也稱作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。ocket本質上就是在2臺網絡互通的電腦之間&#xff0c;架設一個通道…

致敬2016,擁抱2017

2016年5月10號加入現在的團隊&#xff0c;到今天2016年12月31號&#xff0c;已經過去了接近8個月。這整個期間&#xff0c;我們團隊都只有我一個前端工程師&#xff0c;我從剛開始的忐忑不安、壓力極大&#xff0c;到現在基本上手&#xff0c;我們團隊做的項目雖然不大&#xf…

你如何在java中獲取線程堆_如何在Windows上獲取未在控制臺中運行的Java進程的線程和堆轉儲...

問題我有一個Java應用程序&#xff0c;我從控制臺運行&#xff0c;然后控制臺執行另一個Java進程。我想獲得該子進程的線程/堆轉儲。在Unix上&#xff0c;我可以做akill -3 但是在Windows AFAIK上獲取線程轉儲的唯一方法是在控制臺中使用Ctrl-Break。但這只會讓我轉移父進程&am…

html ie亂碼_Java 0基礎入門(初識Html)

在學習Java之前&#xff0c;我們需要了解一定的前端知識。畢竟頁面才是用戶真正看到的&#xff0c;而且也是體現Java后端邏輯結果的地方。學習HTML后&#xff0c;能夠制作界面美觀大方的靜態網站(更復雜的功能需要JavaScript腳本一起來實現)。HTML制作的網頁。所需要的Html開發…

常用自動化框架簡單的分析與介紹

目前常用的可用于APP自動化測試的框架有以下幾個&#xff1a; 1、Monkey是Android SDK自帶的測試工具&#xff0c;在測試過程中會向系統發送偽隨機的用戶事件流&#xff0c;如按鍵輸入、觸摸屏輸入、手勢輸入等)&#xff0c;實現對正在開發的應用程序進行壓力測試&#xff0c;也…

linux一步一腳印---more、less、head、tail

一、more 文件內容或輸出查看命令more 是我們最常用的工具之一&#xff0c;最常用的就是顯示輸出的內容&#xff0c;然后根據窗口的大小進行分頁顯示&#xff0c;然后還能提示文件的百分比&#xff1b; [rootlocalhost ~]# more /etc/profile 1、more 的語法、參數和命令&#…

單片機檢測stc沒反應_我為什么不用STC單片機

寫在2019.10.27這屬于自己打自己臉&#xff0c;不過&#xff0c;我突然想試試 STC15W108.理由可能有點操蛋&#xff0c;因為STM8S沒有 DFN8這樣 3x3的封裝&#xff0c;而PIC的仿真器太貴。我最后感興趣的一個STC型號是 STC15F的8腳系列&#xff0c;那是在2010年&#xff0c;然而…

commons-pool

commons-pool組件是使用對象池時都要用到的。他的作用主要是管理對象池&#xff0c; 當我們要用這個組件時&#xff08;比如redis要用到時&#xff09;&#xff0c;只需要實現它的部分接口&#xff0c;比如PooledObjectFactory接口&#xff0c;實現它的創建對象&#xff0c;銷毀…

JAVA中CyclLink怎么用_Java多線程基本使用一

1 多線程--初步【1進程比如&#xff1a;QQ、迅雷、360、飛秋...2線程的概念3線程的意義&#xff1a;4.Java程序的運行原理代碼是運行在線程中的&#xff0c;如果一個進程沒有線程&#xff0c;那么進程就結束了&#xff0c;也就是說一個進程至少要有一個線程當開啟一個Java…

指針分析

int *a; int b 4; a &b; //a:b的地址 //*a 取b地址的值&#xff0c;為4 //&a為指針變量的地址 //*(&a)為指針變量儲存的地址 即為a int **b &a; //b為指針變量a的地址 //*b為指針變量a所儲存的地址 //改變*b(指針變量所儲存的地址)即改變了*b的值轉載于:http…

live server插件怎么用_分享幾個我日常使用的VS Code插件

在這篇文章中&#xff0c;我想介紹一下自己日常使用中最喜歡的Visual Studio Code擴展。大多數時候&#xff0c;我用VS Code編寫的是JavaScript應用程序(標準JavaScript、React、Angular、NodeJS……各式各樣)。Bracket Pair Colorizer 2這個擴展很不錯&#xff0c;可以幫助我搞…

Xtrabackup數據全備份與快速搭建從服務器

Percona Xtrabackup可以說是一個完美的數據備份工具。特別是當數據庫的容量達到了一定數量級的時候且存在單表達到幾十G的數據量&#xff0c; 很難容忍一些邏輯備份的漫長時間。如單個數據庫約200G&#xff0c;單表最大為120G&#xff0c;mysqldump邏輯備份的時間長達20多小時。…

簡單的java方法_Java簡單實用方法一

整理以前的筆記&#xff0c;在學習Java時候,經常會用到一些方法。雖然簡單但是經常使用。因此做成筆記&#xff0c;方便以后查閱這篇博文先說明構造和使用這些方法。1&#xff0c;判斷String類型數據是否為空String類型的數據為空&#xff0c;主要為等于null或”“那么只要判斷…

Android應用程序開發

第一章 Android應用初體驗 1.1應用基礎 activity是Android SDK中Activity類的一個具體實例&#xff0c;負責管理用戶與信息屏的交互。 應用的功能是通過編寫一個個Activity子類來實現的。 布局定義了一系列用戶界面對象以及它們顯示在屏幕上的位置。組成布局的定義保存在XML文件…

phonegap

phonegap 框架詳解 轉自&#xff1a;http://www.cnblogs.com/hubcarl/p/4216844.html首先, 來看一下phonegap 初始化流程以及Native 與 JS 交互流程圖。 說明&#xff1a;socket server模式下, phonegap.js 源碼實現的采用1 毫秒執行一次XHR請求, 當Native JS 隊列里面有JS語…

j2ee核心模式_Operator和Sidecar正在成為軟件交付新模式

現如今的開發人員希望可以開發出具備彈性和可擴展的分布式系統。該系統受益于軟件復用和開源模型創新&#xff0c;針對安全性問題能夠輕易完成補丁更新并進行低風險的升級。該系統不可能通過帶有各種嵌入式語言庫的應用程序框架來實現。最近&#xff0c;一篇關于“多運行時微服…

微信JS-SDK選擇相冊或拍照并上傳PHP實現

理解&#xff1a;微信上傳接口是拍照&#xff0c;或者選擇本地照片&#xff0c;上傳到微信的服務器&#xff0c;獲取到一個id&#xff0c;通過token與這個id獲取到圖片&#xff0c;保存到服務器即可。 效果 通過微信js接口&#xff0c;調用底層程序。 需要引入js文件&#xff0…

JMS-ActiveMQ學習-3 ActiveMQ與Spring集成

Spring下開發消息的發送和接收程序 點對點模式 一、創建生產者項目 1.創建maven項目 2.添加spring-jms、jms規范、activemq依賴 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms&…

看libevent所遇到的英語生詞

libevent – an event notification library The libevent API &#xff08;libevent應用程序&#xff09;provides a mechanism&#xff08;機制&#xff09; to execute&#xff08;執行&#xff09; a callback function&#xff08;回調函數&#xff09; when a specific&a…