@MapperScan
和 @Repository
是两个与数据访问层相关的注解,它们在功能上有一定的联系,但也有明显的区别。
一、相同点
1. 都与数据访问层相关
@MapperScan
:用于扫描 MyBatis 的 Mapper 接口。MyBatis 是一个流行的持久层框架,Mapper 接口定义了数据库操作的方法,@MapperScan
的作用是将这些接口扫描并注册为 Spring 的 Bean,从而可以在 Spring 应用中方便地使用这些 Mapper。@Repository
:用于标注数据访问层的类,通常用于 DAO(Data Access Object)类。它是一个 Spring 的注解,用于标记一个类是数据访问层的组件。在 Spring 的上下文中,被@Repository
标注的类会被注册为一个 Bean,并且可以享受 Spring 提供的异常处理等功能。
2. 都与 Spring 的 Bean 管理有关
无论是
@MapperScan
还是@Repository
,它们最终的目的都是将相关的类或接口注册为 Spring 的 Bean。这样,这些 Bean 就可以在 Spring 的上下文中被管理,并且可以通过依赖注入的方式被其他组件使用。
二、区别
1. 作用对象不同
@MapperScan
:作用对象:作用于包或类上,用于扫描 MyBatis 的 Mapper 接口。
使用场景:当你使用 MyBatis 作为持久层框架时,需要通过
@MapperScan
来指定 MyBatis 的 Mapper 接口所在的包路径,Spring 会自动扫描这些接口,并为每个接口创建一个代理对象,这个代理对象就是 Spring 的 Bean。示例:
@MapperScan("com.example.mapper") @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
在这个例子中,Spring 会扫描
com.example.mapper
包下的所有接口,并为每个接口创建一个代理对象。
@Repository
:作用对象:作用于类上,用于标注数据访问层的类(通常是 DAO 类)。
使用场景:当你使用传统的 Spring 数据访问方式(如 JDBC Template 或 JPA)时,可以使用
@Repository
来标注你的 DAO 类。这样,Spring 会将这个类注册为一个 Bean,并且可以享受 Spring 提供的异常处理等功能。示例:
@Repository public class UserDao { public User getUserById(int id) { // 实现数据访问逻辑 } }
2. 功能侧重点不同
@MapperScan
:功能侧重点:主要功能是扫描 MyBatis 的 Mapper 接口,并为每个接口创建代理对象。这个代理对象会根据 MyBatis 的配置(如 XML 映射文件或注解)来实现具体的数据库操作。
依赖框架:依赖于 MyBatis 框架。如果没有使用 MyBatis,
@MapperScan
就没有意义。
@Repository
:功能侧重点:主要功能是标注一个类是数据访问层的组件,并将这个类注册为 Spring 的 Bean。它不依赖于具体的持久层框架,可以用于各种数据访问技术(如 JDBC Template、JPA、MyBatis 等)。
依赖框架:依赖于 Spring 框架。它是一个 Spring 提供的注解,用于统一管理数据访问层的组件。
3. 使用方式不同
@MapperScan
:使用方式:通常放在 Spring Boot 的主类或配置类上,指定 MyBatis 的 Mapper 接口所在的包路径。
示例:
@MapperScan("com.example.mapper") @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@Repository
:使用方式:直接标注在数据访问层的类上。
示例:
@Repository public class UserDao { public User getUserById(int id) { // 实现数据访问逻辑 } }
4. 异常处理
@MapperScan
:异常处理:
@MapperScan
本身不直接提供异常处理功能。MyBatis 的异常处理主要依赖于 MyBatis 自身的异常处理机制。
@Repository
:异常处理:
@Repository
提供了异常处理的功能。当在数据访问层抛出异常时,Spring 会将这些异常转换为 Spring 的数据访问异常(如DataAccessException
),从而使得异常处理更加统一和方便。
5. 与事务管理的配合
@MapperScan
:事务管理:
@MapperScan
扫描的 Mapper 接口通常会与事务管理器配合使用。事务管理器可以通过 Spring 的@Transactional
注解来管理事务,而@MapperScan
扫描的 Mapper 接口会参与到事务管理中。
@Repository
:事务管理:
@Repository
标注的类也可以与事务管理器配合使用。事务管理器可以通过 Spring 的@Transactional
注解来管理事务,而@Repository
标注的类会参与到事务管理中。
ok,以上就是本次分享的内容~