24.9.7——小學期開發實記

sodamate發表於2024-09-08

今天完成了基礎資訊的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”錯誤。這個問題的根本原因可能包括:

  1. Bean未註冊workCenterInfoMapper 介面沒有被Spring容器識別為一個bean,通常是因為缺少必要的註解(如 @Mapper@Repository)。
  2. 元件掃描配置問題:Spring的元件掃描可能沒有覆蓋到包含 workCenterInfoMapper 的包。
  3. 依賴注入的方式@Autowired 是按型別注入,而 @Resource 是按名稱注入。如果存在多個相同型別的bean,@Autowired 可能會失敗,而 @Resource 可以透過名稱找到特定的bean。

後面搜尋原因的時候發現@mapper確實沒有注入,是我疏忽大意了。

24.9.7——小學期開發實記

加上之後果然不報錯了。

解決方案:

將註解從 @Autowired 更改為 @Resource 後,問題解決的原因如下:

1. 按名稱注入

  • @Resource 預設按名稱進行注入。如果Spring容器中存在名為 workCenterInfoMapper 的bean,它會直接找到並注入該bean,而不需要考慮型別匹配的問題。

2. 避免型別衝突

  • 如果存在多個同型別的bean,使用 @Autowired 可能會引發衝突,導致無法確定注入哪個bean。而 @Resource 透過名稱可以明確指定要注入的bean,避免了這種衝突。

3. 更加靈活的配置

  • @Resource 是Java EE標準註解,具有更好的相容性和靈活性,適用於需要按名稱或型別注入的場景。

相關文章