摘要:今天在搭建項目的時候,遇到了一個奇怪的問題。中需要注入,中需要注入的接口,屬性都是通過標簽名的方式注入的。給你報錯,就算不影響項目運行,那也確實有些不合適的地方。但是如果項目無法運行,僅關掉報警根本沒卵用。
今天在搭建SpringBoot+SpringMVC+mybaits項目的時候,遇到了一個奇怪的問題。
Controller中需要注入Service,Service中需要注入Mybatis的Dao接口,屬性都是通過“@+標簽名”的方式注入的。比如一個簡單的查詢用戶的controller,需要注入一個與用戶有關的service:
@RequestMapping("/user") @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/list/all") public ListlistAll(){ return userService.listAll(); } }
service中又要注入Dao的接口:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public ListlistAll(){ return userMapper.selectAll(); } }
但是在Service層竟然出現了如此問題:
不過問題不大,項目能夠正常運行,并且使用@Resource標簽代替@Autowired就可以完全解決問題:
但是為什么@Autowired在IDEA里面會有問題呢,經過網上尋找+個人思考,有以下兩點結論:
1- 根據使用報錯信息在網上搜索出的解決方案的總結
首先是IDEA這個工具強大的檢測報警機制,如果IDEA說你的代碼沒問題,那么它肯定能編譯通過。給你報錯,就算不影響項目運行,那也確實有些不合適的地方。看到網上有些答案很可笑,讓你去settings里面把這個報警關掉,這不是掩耳盜鈴嗎?當然了,如果不影響項目的正常運行,關掉報警也是一種方法,畢竟程序員看不見warning。但是如果項目無法運行,僅關掉報警根本沒卵用。
2- @Autowired與@Resource的區別
@Autowired根據type注入,@Resource根據name注入,本質上均實現了注入效果,只是依據不同,那么為什么我在Controller中使用@Autowired就沒問題呢,我認為原因在于兩個地方注入Bean的類型不一樣。以下是個人思考,如有不對請指教。
一般來說,注入controller的service雖然一般來說我們都是注入一個接口,但是該接口有實現類,并且使用@Service進行關聯,所以注入類型應該也可以視為一個類,但是mybatis僅需提供Dao接口,也就是說,注入service的dao只是一個接口,而沒有實現類,雖然mybatis能夠通過Dao接口和xml文件實現與數據庫的操作,但是@Autowired并沒有這個識別功能,可能它就認為你類型不匹配,無法使用通過類型注入的方法。這個理論我通過一個簡單的方法驗證通過,做法如下:
我把service的實現類給取消了實現接口的語句‘implements UserService’,然后變成下面這樣:
@Service public class UserServiceImpl{ @Resource private UserMapper userMapper; public ListlistAll(){ return userMapper.selectAll(); } }
此時,IDEA給controller中的注入也報出同樣的警告:
所以我有充足的理由斷定,應該是這個原因,也就是說,@Autowired不適用service層對于dao的注入。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75378.html
摘要:新入手了一個,打算重新配置下自己的開發環境,老的畢竟硬盤太小了,所以這次換了個的,好了閑話不說了,主要記錄下我在安裝系列產品中遇到的問題和解決辦法。安裝的產品,下載,安裝,很順利,沒毛病。 新入手了一個Macbook pro,打算重新配置下自己的開發環境,老的mac畢竟硬盤太小了,所以這次換了個1T的,好了閑話不說了,主要記錄下我在安裝idea系列產品中遇到的問題和解決辦法。 ...
摘要:新入手了一個,打算重新配置下自己的開發環境,老的畢竟硬盤太小了,所以這次換了個的,好了閑話不說了,主要記錄下我在安裝系列產品中遇到的問題和解決辦法。安裝的產品,下載,安裝,很順利,沒毛病。 新入手了一個Macbook pro,打算重新配置下自己的開發環境,老的mac畢竟硬盤太小了,所以這次換了個1T的,好了閑話不說了,主要記錄下我在安裝idea系列產品中遇到的問題和解決辦法。 ...
摘要:文章目錄前言從上下源碼后運行報錯不支援驗證類型。解決辦法就是去找到下載,注意選擇源碼版本下載,如下圖。入門教程本地環境搭建和源碼編譯安裝,獻給編譯失敗的同學,教程不斷優化附錄 ...
摘要:能夠幫助大家少踩坑就好。找到上述代碼中最相似的地方,添加錯誤解決方法路徑錯誤,即當前訪問的路徑下沒有相關文件。解決辦法在文件存儲服務器中的項目名的路徑下,新建一個和你上傳服務器路徑一致的文件,我這里是文件。 能夠幫助大家少踩坑就好。 1.springMVC跨服務器上傳文件報錯問題 當我們使用jersy把圖片上傳到我們的圖片服務器中【tomcat】,我們可能會遇見以下三個錯誤: retu...
閱讀 2784·2021-09-01 10:30
閱讀 1680·2019-08-30 15:52
閱讀 965·2019-08-29 18:40
閱讀 1116·2019-08-28 18:30
閱讀 2391·2019-08-23 17:19
閱讀 1321·2019-08-23 16:25
閱讀 2700·2019-08-23 16:18
閱讀 2977·2019-08-23 13:53