若項(xiàng)目中使用了@MapperScan注解后,則@Mapper注解不再生效,
原因是:@MapperScan注解 會(huì)執(zhí)行@Import(MapperScannerRegistrar.class),而MapperScannerRegistrar又會(huì)注冊(cè)MapperScannerConfigurer BEAN,在MapperScannerConfigurer BEAN中會(huì)完成基于配置的包目錄掃描注冊(cè)所有mapper interface代理BEAN,而@Mapper注解的生效是由org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.MapperScannerRegistrarNotFoundConfiguration 配置BEAN類執(zhí)行@Import(AutoConfiguredMapperScannerRegistrar.class),在AutoConfiguredMapperScannerRegistrar中會(huì)掃描所有@Mapper注解的mapper interface并注冊(cè)為代理BEAN,但在執(zhí)行@Import(AutoConfiguredMapperScannerRegistrar.class)時(shí)有一個(gè)前提,那就是@ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })【即:在沒有MapperFactoryBean 或 MapperScannerConfigurer】時(shí)才會(huì)執(zhí)行,由于MapperScannerRegistrarNotFoundConfiguration 是MybatisAutoConfiguration 配置BEAN的子類,所以MapperScannerRegistrarNotFoundConfiguration 會(huì)晚于@MapperScan標(biāo)記的頂級(jí)類,故正常情況下一旦使用了@MapperScan注解后,由于MapperScannerConfigurer BEAN已注冊(cè),那么MapperScannerRegistrarNotFoundConfiguration 上的@Import(AutoConfiguredMapperScannerRegistrar.class)將不會(huì)被執(zhí)行。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-667182.html
另外要實(shí)現(xiàn)動(dòng)態(tài)條件注冊(cè)Mapper接口,我們只需要在mapper interface上加上@Conditional(...) 條件注解即可,
原理是:不論是@MapperScan 或是@Mapper 最終都是使用ClassPathMapperScanner.scan完成掃描并注冊(cè)成BEAN的,而在scan過程中又會(huì)支持較多的TypeFilter,以及在確定候選組件時(shí)(org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents)又會(huì)進(jìn)行條件判斷(即:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#isConditionMatch),判斷是否可以跳過(即:org.springframework.context.annotation.ConditionEvaluator#shouldSkip),在shouldSkip方法中會(huì)又會(huì)判斷是否為Conditional注解,若是則會(huì)執(zhí)行Condition#matches 進(jìn)行匹配,若返回true則表示符合要求不跳過(即:候選的BEAN),否則跳過,如此即實(shí)現(xiàn)了動(dòng)態(tài)條件注冊(cè)Mapper接口代理BEAN的功能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-667182.html
到了這里,關(guān)于答疑解惑:解釋在Mybatis-Spring下@Mapper與@MapperScan為何不能同時(shí)生效以及實(shí)現(xiàn)動(dòng)態(tài)條件注冊(cè)Mapper接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!