@Mapper 与 @MapperScan 的区别

之前一直用Mapper,后来项目中用MapperScan, 再后来一不小心两个一起用了,就出现问题了,本文讲解两个注解的作用和优先级。

1、@Mapper 作用

用在接口类上,在编译之后会生成相应的接口实现类

位置:对应的某个接口类上面 如果每个接口类 都要

@Mapper 注解,是重复而无聊的工作,解决这个问题用 @MapperScan 。

2、@MapperScan 作用

扫描指定包下所有的接口类,然后所有接口在编译之后都会生成相应的实现类

位置:是在 SpringBootApplication 启动类上面添加 。

@MapperScan 是对整个包下的所有的接口类的注解。是批量的操作。使用 @MapperScan 后,接口类 就不需要使用 @Mapper 注解。

3、各种场景

1、只使用@Mapper注解,不使用@MapperScan注解。会扫描@Mapper注解所在接口,生成动态代理类,注入到Spring容器中。

2、只使用@MapperScan注解,不使用@Mapper注解。会扫描@MapperScan注解配置的包下面的接口生成动态代理类,注入到Spring容器中。

3、@Mapper、@MapperScan注解都使用,@Mapper接口,在@MapperScan注解中有配置包路径,那么可以正常使用。

4、@Mapper、@MapperScan注解都使用,@Mapper接口,在@MapperScan注解中没有配置包路径,那么会报错,解决办法,就是在@MapperScan注解中配置正确路径下的包即可。

第四种场景是比较容易出错的。这个具体原因我还是不是很清楚,表面上暂时理解为@MapperScan的优先级高于@Mapper, 有了@MapperScan后,@Mapper就不生效了,后面我深入分析源码看下。

posted @ 2022-12-13 23:04  小log  阅读(1223)  评论(0)    收藏  举报