Spring的@Component、@Controller、@Service、@Repository、@Mapper

Spring框架中@Component和@Controller、@Service、@Repository、@Mapper的区别和使用方法

AvatarYuan·2025-03-23·32

在Spring框架中,@Component@Controller@Service@Repository 是核心注解,用于依赖注入和组件扫描,而 @Mapper 通常是MyBatis的注解。它们的区别主要体现在语义用途框架层级上。以下是详细对比:


1. @Component

  • 作用:通用注解,标记一个类为Spring管理的组件(Bean),会被自动扫描到IoC容器中。
  • 使用场景:适用于所有不属于其他特定层(如Controller/Service/Repository)的通用组件。
  • 特点
    • 是其他注解(@Controller@Service@Repository)的基类。
    • 没有明确的语义,仅表示类需要被Spring管理。

2. @Controller

  • 作用:标记一个类为Web层控制器,处理HTTP请求(如MVC中的Controller)。
  • 使用场景:定义REST API或传统Spring MVC的请求处理器。
  • 特点
    • 通常与 @RequestMapping@GetMapping 等注解配合使用。
    • 在Spring Boot中,@RestController@Controller + @ResponseBody 的组合。

3. @Service

  • 作用:标记一个类为业务逻辑层组件,封装业务逻辑。
  • 使用场景:实现核心业务逻辑的类(如订单服务、用户服务)。
  • 特点
    • 强调类的职责是“业务逻辑”,而非数据访问或表现层。
    • 无特殊技术功能,但能提高代码可读性。

4. @Repository

  • 作用:标记一个类为数据访问层组件,通常用于数据库操作(DAO层)。
  • 使用场景:直接与数据库交互的类(如JPA Repository、MyBatis Mapper)。
  • 特点
    • 自动转换数据访问异常:将底层数据库异常(如JDBC的SQLException)转换为Spring的统一DataAccessException
    • 在JPA中,@Repository 接口通常继承自 JpaRepository

5. @Mapper(MyBatis注解)

  • 作用MyBatis框架中标记接口为数据库映射器(Mapper),MyBatis会为这些接口生成代理实现类。
  • 使用场景:定义MyBatis的Mapper接口,用于执行SQL操作。
  • 特点
    • 非Spring原生注解,属于MyBatis框架。
    • 需要配合 @MapperScan 注解或在配置中指定扫描路径。
    • @Repository 的区别:@Mapper 由MyBatis管理,而 @Repository 由Spring管理(可结合使用)。

对比表格

注解框架归属层级/用途特殊功能
@ComponentSpring通用组件
@ControllerSpringWeb层(处理HTTP请求)路由映射(如@RequestMapping
@ServiceSpring业务逻辑层无(语义化标记业务逻辑)
@RepositorySpring数据访问层(DAO)异常转换(JDBC → Spring异常)
@MapperMyBatis数据访问层(MyBatis Mapper)MyBatis接口代理实现

关键区别总结

  1. 语义化分层
    • @Controller(Web层)、@Service(业务层)、@Repository(DAO层)是Spring对@Component的细化,提供清晰的代码分层。
    • @Component 适用于无法归类到上述层的通用组件。
  2. 异常处理
    • 只有 @Repository 会自动转换数据访问异常。
  3. 框架归属
    • @Mapper 是MyBatis的注解,需要与Spring集成(如通过@MapperScan),而其他注解都是Spring原生。
  4. 技术实现
    • @Controller@RestController 用于构建Web接口。
    • @Repository 可结合JPA/Hibernate,而 @Mapper 通常用于MyBatis的SQL映射。

示例代码

// Web层
@Controller
public class UserController {
    @Autowired
    private UserService userService;
}

// 业务层
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

// 数据访问层(Spring管理)
@Repository
public class UserRepositoryImpl implements UserRepository {
    // 使用JPA或JDBC操作数据库
}

// MyBatis Mapper(MyBatis管理)
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(int id);
}

在开发中建议根据代码的职责选择对应的注解,以提高可读性和维护性。