@MapperScan的作用
-
@MapperScan
的作用:- 这个注解告诉 MyBatis-Spring-Boot-Starter 自动扫描指定包(及其子包)下的所有接口。
- 对于扫描到的每个接口,MyBatis 会自动创建一个 MapperFactoryBean。
- 这个 MapperFactoryBean 会被注册到 Spring 容器中。
-
自动 IoC 管理:
- 通过上述过程,所有在指定包下的 Mapper 接口都会自动被 Spring 容器管理。
- 这意味着你可以直接在其他 Spring 管理的类中注入这些 Mapper,而不需要额外的注解。
-
不需要
@Component
:- Mapper 接口是特殊的 Spring bean,它们由 MyBatis 通过动态代理实现。
@Component
通常用于标记普通的 Spring 组件,而 Mapper 接口已经通过@MapperScan
被特殊处理了。
@MapperScan(“”)和@Mapper的对比
使用 @MapperScan("")
和在每个 Mapper 接口上添加 @Mapper
注解都可以实现将 Mapper 接口注册到 Spring 容器中的目的。让我们来比较这两种方法:
- 使用
@MapperScan("com.hkd.mapper")
:
优点:
- 集中配置,只需要在配置类上添加一次注解。
- 减少了在每个 Mapper 接口上添加注解的重复工作。
- 如果有新的 Mapper 接口添加到指定包中,不需要额外的配置。
缺点:
- 可能会扫描到不需要的接口,如果包内有非 Mapper 的接口。
- 在每个 Mapper 接口上使用
@Mapper
注解:
优点:
- 更加明确,每个 Mapper 接口都清楚地标识了它的用途。
- 可以更精确地控制哪些接口被视为 Mapper。
- 不依赖于包结构,Mapper 可以分布在不同的包中。
缺点:
- 需要在每个 Mapper 接口上都添加注解,有些重复工作。
- 如果忘记在新增的 Mapper 上添加注解,可能会导致该 Mapper 无法被识别。
选择建议:
-
对于小型项目或 Mapper 较少的情况,使用
@Mapper
注解可能更直观。 -
对于大型项目或 Mapper 较多的情况,使用
@MapperScan
可以减少重复工作,更易于管理。 -
有些开发者会同时使用两种方法:在配置类上使用
@MapperScan
,同时在 Mapper 接口上使用@Mapper
。这样做可以兼顾两种方法的优点,虽然有些冗余,但可以增加代码的可读性和明确性。