当MybatisAutoConfiguration使用AutoService加载时出现“No MyBatis mapper was found in ‘[启动类]’ package. Please check your configuration”警告

问题说明

最近在做一个环境底层包,使用core-db模块jar包封装数据访问相关的默认配置,包含MybatisPlus,由于各工程路径不一致,所以MapperScan的basePackages一定是需要通配符的,配置大概如下

1
2
3
4
@Configuration
@MapperScan("top.kthirty.**.mapper")
public class MybatisPlusConfiguration {}

在META-INF中添加spring.factories文件内容如下

1
2
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
top.kthirty.core.db.config.MybatisPlusConfiguration

利用Spring的装载机制导入Config类(由于包路径不同,Spring无法扫描到该类,故需要使用spring.factories
但是启动时会出现一个警告No MyBatis mapper was found in '[启动类所在包]' package. Please check your configuration.

问题分析

因为只是警告,并没有影响正常的功能使用,说明我自定义的MybatisPlusConfiguration生效了,只不过在生效之前出现了警告。
说明该类的加载时在com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration之后的
所以只需要保证自定义的Config在MybatisPlus定义的Config之前加载就可以了,正好有一个注解@AutoConfigureBefore可以保证此顺序。

最终结果

1
2
3
4
@Configuration
@MapperScan("top.kthirty.**.mapper")
@AutoConfigureBefore(MybatisPlusAutoConfiguration.class)
public class MybatisPlusConfiguration {}

总结

当使用spring.factories加载配置类时,无法保证顺序的话,可能会重复装载或装载无用类,导致出现警告或无法启动,只要注意装载顺序就可以了

灵感来源