在 Spring 框架中,@Mapper
、@Service
和 @Component
都是用于标记类的注解,但它们的用途和适用场景不同,以下是它们的核心区别和关系:
1. @Component
- 作用:
Spring 的通用组件注解,标记一个类为 Spring 管理的 Bean,会被自动扫描并注入到容器中。 - 适用场景:
适用于任何需要被 Spring 管理的组件(如工具类、非业务层类)。 - 示例:
@Component public class MyUtil { // 工具类逻辑 }
2. @Service
- 作用:
@Component
的特化版本,专门用于标记业务逻辑层(Service 层)的类,功能和@Component
完全一致,但语义更明确。 - 适用场景:
明确标识业务逻辑组件,提高代码可读性。 - 示例:
@Service public class UserService { // 业务逻辑代码 }
3. @Mapper
- 作用:
通常是 MyBatis 框架的注解,标记一个接口为 MyBatis 的数据映射接口(Mapper 接口),MyBatis 会为其动态生成实现类。 - 与 Spring 的关系:
- 不属于 Spring 原生注解,但通过整合框架(如 MyBatis-Spring)能被 Spring 管理。
- 需要配合
@MapperScan
注解扫描接口,或配置 MyBatis 的 Mapper 扫描路径。
- 适用场景:
数据库操作层(DAO 层),定义 SQL 映射。 - 示例:
@Mapper // MyBatis 注解 public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User findById(Long id); }
三者的关系
注解 | 所属框架 | 层级/用途 | 与 @Component 的关系 |
---|---|---|---|
@Component |
Spring | 通用组件 | 基础注解,其他注解的元注解 |
@Service |
Spring | 业务逻辑层(Service) | 继承自 @Component ,语义特化 |
@Mapper |
MyBatis | 数据访问层(DAO/Mapper) | 与 @Component 无关,由 MyBatis 处理 |
关键区别
语义不同:
@Component
是通用组件。@Service
明确标识业务逻辑。@Mapper
标识数据库操作接口。
框架支持:
@Component
和@Service
是 Spring 原生注解。@Mapper
是 MyBatis 的注解,需依赖 MyBatis 框架。
生成方式:
@Component
和@Service
的类由 Spring 直接实例化。@Mapper
接口由 MyBatis 动态生成代理实现类。
什么时候用哪个?
- 用
@Component
:通用工具类、非业务组件。 - 用
@Service
:业务逻辑层(Service 层)。 - 用
@Mapper
:MyBatis 的数据库操作接口(DAO 层)。