在 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 层)。