springboot整合mybatis mapper注入時顯示could not autowire的解決
原因
IDEA會自動掃描代碼的上下文, 如果類前有
Component
,
Controller
,
Service
,
Repository
之中任意注解的類, 自動注冊到Spring的Bean管理庫中. IDEA會智能的提示.
但是, 在 mapper 中, 沒有用到上面的那些注解. 使用
@Mapper
注解. 這個注解的作用, 源碼中注釋沒有寫, 比較遺憾.
但是可以猜測是和 xml 中的配置有相同的作用.
在Spring-MVC中使用一下配置, 來聲明一個映射器:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
MapperFactoryBean 建立的代理類實作了 UserMapper 接口,并且注入到應用程式中。 因為代理建立在運作時環境中(Runtime,譯者注) ,那麼指定的映射器必須是一個接口,而 不是一個具體的實作類。
mybatis 的 xml 配置解釋參考官網, 沒必要貼出來
spring-mybatis官網
SpringBoot-mybatis官網
因為 IDEA 不認為
@Mapper
注解是用來聲明一個Bean, 是以就會提示無法找到Bean.
解決
方式一: 降低 IDEA 錯誤提示的等級
因為這是 IDEA 自動提示
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauEzNzATMwEzM50SMwcTO0EzM4ETOxcDM2EDMy0yNxIzN3kzLcdDM2EDMy8CX3EjM3cTOvw1ZvxmYvwVbvNmLzd2bsJmbj5SNxAjMzV2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
方式二: 在映射器接口上添加@Component注解
當然, 添加
Component
,
Controller
,
Service
,
Repository
四個注解中的任意一個都可以解決. 功能是相同的. 但是為了語意明确, 應該使用
Component
,
Repository
中的一個.
方式三: 使用構造器
Spring5中autowired注解官方文檔
用谷歌翻譯一下:
也就是說, 當類中, 隻有一個構造器的時候, Spring會自動将通過構造器的方式注入Bean.
生成構造器也有好幾種方式
- 利用編輯器自動生成
- 用
的lombok
注解@AllArgsConstructor
注意: 用構造器的方式注入Bean, 要防止循環依賴