天天看點

springboot整合mybatis mapper注入時顯示could not autowire的解決springboot整合mybatis mapper注入時顯示could not autowire的解決

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 自動提示

springboot整合mybatis mapper注入時顯示could not autowire的解決springboot整合mybatis mapper注入時顯示could not autowire的解決

方式二: 在映射器接口上添加@Component注解

當然, 添加

Component

,

Controller

,

Service

,

Repository

四個注解中的任意一個都可以解決. 功能是相同的. 但是為了語意明确, 應該使用

Component

,

Repository

中的一個.

方式三: 使用構造器

Spring5中autowired注解官方文檔

用谷歌翻譯一下:

springboot整合mybatis mapper注入時顯示could not autowire的解決springboot整合mybatis mapper注入時顯示could not autowire的解決

也就是說, 當類中, 隻有一個構造器的時候, Spring會自動将通過構造器的方式注入Bean.

生成構造器也有好幾種方式

  • 利用編輯器自動生成
  • lombok

    @AllArgsConstructor

    注解

注意: 用構造器的方式注入Bean, 要防止循環依賴