首先介绍一下背景
新建了一个模块,然后按部就班的写了controll层
关键点来了
我用Mybatis-X的插件生成了实体类,mapper及注解还有service
但是mapper上面是没有@Mapper这个注解的
我前几天刚好分析了springboot的自动装配原理,我想着用
@ComponentScan("com.yupi.apiinterface.mapper")
这个注解来扫描mapper包,不过竟然报错了
No MyBatis mapper was found in '[com.yupi.apiinterface]' package. Please check your configuration.
最关键的是这项目启动没有问题:
然后我刚好在模拟向后端发送请求这个功能
然后我发现,后端都收不到我的请求
后面我看了一下任务管理器:
8开头的端口没有我的项目进程
后面才回头去看了我的控制台发现了这个问题
解决问题:
后面去问了GPT:
在Spring Boot中,使用 MyBatis 时,@MapperScan
是推荐的做法,用于扫描 Mapper 接口并自动注册它们为 Spring Bean。虽然你可以使用 @ComponentScan
来扫描包含 Mapper 接口的包,但实际情况下,MyBatis 需要特定的注解(如 @Mapper
)来正确地识别 Mapper 接口。
问题分析
-
@ComponentScan:
@ComponentScan
可以扫描 Spring 管理的组件(包括带有@Component
、@Service
、@Repository
和@Controller
注解的类)。- 但是,MyBatis 的 Mapper 接口并不默认被识别,需要特定的处理。
-
@Mapper:
- 使用
@Mapper
注解标记的接口会被 MyBatis 识别为 Mapper接口,并能够生成实现类。 - 当你在 Mapper 接口上添加
@Mapper
注解后,MyBatis 就能够找到并加载它们。
- 使用
推荐解决办法:
-
使用
@MapperScan
注解:import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.yupi.apiinterface.mapper") // 指定 Mapper 接口的包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
-
如果想继续使用
@ComponentScan
,那么请确保你的 Mapper 接口确实有@Mapper
注解。 -
确保你的项目的依赖中包含了 MyBatis 和适用于你使用的数据库的 MyBatis Spring Boot Starter。
总结起来就是说@ComponentScan只能管理springboot的组件
像Service Repository和Controll,这种能被注册成Bean对象
如果你用了Mybatis的插件,就推荐用@MapperScan这个注