今天完成了基礎資訊的CRUD,但是遇到了一個關於JAVA Spring Boot注入的問題。
問題如下:
Error:(20, 34) Could not autowire. No beans of 'workCenterInfoMapper' type found.
@Autowired
private workCenterInfoMapper workCenterInfoMapper;
我改成:
@Resource
private workCenterInfoMapper workCenterInfoMapper;
就不報錯了。
報錯原因分析:
當你使用 @Autowired
註解時,Spring會嘗試根據型別自動裝配所需的bean。如果在Spring的上下文中找不到型別為 workCenterInfoMapper
的bean,就會丟擲“Could not autowire”錯誤。這個問題的根本原因可能包括:
- Bean未註冊:
workCenterInfoMapper
介面沒有被Spring容器識別為一個bean,通常是因為缺少必要的註解(如@Mapper
或@Repository
)。 - 元件掃描配置問題:Spring的元件掃描可能沒有覆蓋到包含
workCenterInfoMapper
的包。 - 依賴注入的方式:
@Autowired
是按型別注入,而@Resource
是按名稱注入。如果存在多個相同型別的bean,@Autowired
可能會失敗,而@Resource
可以透過名稱找到特定的bean。
後面搜尋原因的時候發現@mapper確實沒有注入,是我疏忽大意了。
加上之後果然不報錯了。
解決方案:
將註解從 @Autowired
更改為 @Resource
後,問題解決的原因如下:
1. 按名稱注入
@Resource
預設按名稱進行注入。如果Spring容器中存在名為workCenterInfoMapper
的bean,它會直接找到並注入該bean,而不需要考慮型別匹配的問題。
2. 避免型別衝突
- 如果存在多個同型別的bean,使用
@Autowired
可能會引發衝突,導致無法確定注入哪個bean。而@Resource
透過名稱可以明確指定要注入的bean,避免了這種衝突。
3. 更加靈活的配置
@Resource
是Java EE標準註解,具有更好的相容性和靈活性,適用於需要按名稱或型別注入的場景。