springboot不掃描@repository的問(wèn)題及解決
springboot不掃描@repository問(wèn)題
問(wèn)題
單獨(dú)使用@repository注解注dao層,而且不使用@mapperscan掃描時(shí),啟動(dòng)項(xiàng)目會(huì)報(bào)錯(cuò):
Field xxxxMapper in com.sms.shiro.service.impl.xxxxServiceImpl required a bean of type ‘com.sms.shiro.mapper.xxxxMapper’ that could not be found.
一.@mapper和@repository的區(qū)別
1.@mapper是mybatis的注解,@repository是spring家族的注解。
2.使用@mapper注解時(shí),spring并不認(rèn)識(shí),@autowired注入到service里的mapper會(huì)爆紅。
二.回到問(wèn)題中來(lái)
明明springboot里的ComponentScan掃描了啟動(dòng)器包下的所有含注解的組件,那為什么卻找不到@repository的組件?
原因:
造成這個(gè)問(wèn)題的原因是因?yàn)閟pringboot在掃描時(shí)候自動(dòng)過(guò)濾掉了接口和抽象類,所以@repository修飾的mapper接口并不能稱為一個(gè)bean,自然也就無(wú)法注入到service中。
三.解決方式
第一種: 不使用@repository,在mapper層接口直接使用@mapper,但如果項(xiàng)目工程較大的話就會(huì)很麻煩。
第二種: 如果想使用@repository,因?yàn)閟pringboot無(wú)法掃描到mapper接口,則在啟動(dòng)器上使用@mapperscan掃描所有mapper接口的包,如:@MapperScan("com.sms.shiro.*.mapper")
第三種: 其實(shí)使用@mapperscan注解掃描mapper接口后,mapper接口就不需要@repository和@mapper去注冊(cè)bean了,但如果想項(xiàng)目結(jié)構(gòu)比較明了,在使用了@mapperscan掃描后,@repository和@mapper都可使用,都不會(huì)報(bào)錯(cuò)了,但是使用@repository會(huì)解決在service中@autowired mapper爆紅的問(wèn)題。
SpringBoot關(guān)于@Mapper和@Repository的一些疑問(wèn)
@Mapper 是 Mybatis 的注解,和 Spring 沒(méi)有關(guān)系,@Repository 是 Spring 的注解,用于聲明一個(gè) Bean。
@Mapper
Mybatis 需要找到對(duì)應(yīng)的 mapper,在編譯的時(shí)候動(dòng)態(tài)生成代理類,才能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的一系列操作,所以我們需要在接口上添加 @Mapper 注解。
例如(這里只是為了演示并且sql不復(fù)雜,所以這里使用注解的方式來(lái)編寫sql語(yǔ)句):
@Mapper public interface UserMapper { @Select("select * from user where id = #{id}") User getById(Integer id); @Select("select * from user") List<User> getAll(); }
編寫測(cè)試方法,可以發(fā)現(xiàn)加了自動(dòng)裝配注解的userMapper會(huì)出現(xiàn)報(bào)錯(cuò)(并不影響代碼正常運(yùn)行),這是因?yàn)锧Mapper是Mybatis中的注解,我們沒(méi)有顯示的標(biāo)明UserMapper是spring中的一個(gè)Bean,idea此時(shí)會(huì)認(rèn)為在運(yùn)行時(shí)找不到實(shí)例注入,所以會(huì)提示錯(cuò)誤
雖然這個(gè)報(bào)錯(cuò)并不影響代碼的正常運(yùn)行,但是看著很不舒服,我們可以@Repository注解(也可以使用@Componet,只要注明這是一個(gè)bean就可以)來(lái)顯示的說(shuō)明UserMapper是一個(gè)bean
@Repository
@Repository 是spring提供的一個(gè)注解,用于聲明 dao 層的 bean,如果我們要真正地使用 @Repository 來(lái)進(jìn)行開(kāi)發(fā),那么我們需要手動(dòng)實(shí)現(xiàn)UserMapperImpl,也就是說(shuō)手寫 JDBC代碼?。?!
@Repository public class UserMapperImpl implements UserMapper{ @Override public User getById(Integer id){ // 裝載Mysql驅(qū)動(dòng) // 獲取連接 // 創(chuàng)建Statement // 構(gòu)建SQL語(yǔ)句 // 執(zhí)行SQL返回結(jié)果 } }
@MapperScan(“com.xxx.xxx”)
如果我們不使用@Mapper注解,還有另一種方式讓Mybatis找到mapper接口,那就是 @MapperScan 注解,可以在啟動(dòng)類上添加該注解,自動(dòng)掃描包路徑下的所有mapper接口。
@SpringBootApplication @MapperScan("com.example.springboot_mybatis.mapper") public class SpringbootMybatisApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisApplication.class, args); } }
使用@MapperScan注解之后,就不需要在mapper接口上添加任何注解了?。?/p>
心得:
總的來(lái)說(shuō),@Mapper 和 @MapperScan 這兩個(gè)必須有一個(gè),否則就會(huì)出錯(cuò)!
@Repository 可有可無(wú),對(duì)程序正常運(yùn)行沒(méi)什么影響,但是可以消除idea報(bào)錯(cuò)的問(wèn)題
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 淺談springboot @Repository與@Mapper的區(qū)別
- springboot使用redisRepository和redistemplate操作redis的過(guò)程解析
- springboot使用RedisRepository操作數(shù)據(jù)的實(shí)現(xiàn)
- springboot jpaRepository為何一定要對(duì)Entity序列化
- 解決springboot無(wú)法注入JpaRepository的問(wèn)題
- springboot 沒(méi)法掃描到repository的解決
- Springboot以Repository方式整合Redis的方法
相關(guān)文章
Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解
線性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。本文將通過(guò)后端Java程序?qū)崿F(xiàn)將PDF文件轉(zhuǎn)為線性化PDF。感興趣的可以了解一下2021-12-12Java Collections集合繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java Collections集合繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04新手小白看過(guò)來(lái)學(xué)JAVA必過(guò)IO流File字節(jié)流字符流
這篇文章主要介紹了新手小白學(xué)JAVA到IO流File字節(jié)流字符流的重點(diǎn),對(duì)流不清楚的新手同學(xué)快進(jìn)來(lái)學(xué)習(xí)吧,大佬也可以進(jìn)來(lái)溫故一下2021-08-08Java實(shí)現(xiàn)的zip工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip工具類,結(jié)合完整實(shí)例形式分析了Java針對(duì)zip文件指定路徑壓縮、遞歸壓縮等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12dm.jdbc.driver.DMException網(wǎng)絡(luò)通信異常的解決過(guò)程
最近一個(gè)項(xiàng)目里面出現(xiàn)了一個(gè)比較詭異的問(wèn)題,給大家分享下,這篇文章主要給大家介紹了關(guān)于dm.jdbc.driver.DMException網(wǎng)絡(luò)通信異常的解決過(guò)程,需要的朋友可以參考下2023-02-02java實(shí)現(xiàn)找出兩個(gè)文件中相同的單詞(兩種方法)
這篇文章主要介紹了java實(shí)現(xiàn)找出兩個(gè)文件中相同的單詞(兩種方法),需要的朋友可以參考下2020-08-08