@Service、@Repository、@Controller/@RestController 均为@Component的语义化变体,分别用于业务逻辑层、数据访问层和表现层,实现分层清晰、职责明确;依赖方向为Controller→Service→Repository。

这三个注解本质都是 @Component 的语义化变体,核心作用是把类交给 Spring 容器管理,分层使用主要为了结构清晰、职责明确、便于维护和工具识别。
@Service 用在业务逻辑层
标注处理具体业务规则的类,比如用户注册校验、订单生成逻辑、积分计算等。它通常依赖 @Repository 提供的数据,又可能被 @Controller 调用。
- 放在实现类上(如 UserServiceImpl),不建议放在接口上
- 可指定 bean 名称,例如
@Service("userBusinessService"),否则默认为类名首字母小写(userServiceImpl) - Spring 会自动将其纳入 IoC 容器,支持 @Autowired 注入
@Repository 用在数据访问层
专用于 DAO 或 Mapper 类,负责与数据库交互(增删改查)。Spring 会自动将 JDBC 或 MyBatis 抛出的原始异常转为统一的 DataAccessException,便于统一异常处理。
- 常见于 XxxMapper、XxxDao、XxxRepository 实现类
- 即使用了 MyBatis-Plus 或 JPA,仍推荐加 @Repository,保持分层语义
- 同样支持 value 属性自定义 bean 名,如
@Repository("userJdbcDao")
@Controller 或 @RestController 用在表现层
@Controller 用于传统 MVC(返回视图页面),@RestController 用于 RESTful 接口(直接返回 JSON/XML 数据)。
立即学习“Java免费学习笔记(深入)”;
- @RestController = @Controller + @ResponseBody,适合前后端分离项目
- 该层只做请求接收、参数校验、调用 Service、封装响应,不写业务或 SQL
- 方法上常用 @GetMapping、@PostMapping 等细化 HTTP 动作,路径优先级高于类上 @RequestMapping
补充说明
它们之间是单向依赖关系:Controller → Service → Repository。Spring 不强制检查这种依赖方向,但违反会导致架构混乱、测试困难、循环依赖风险上升。实际开发中,只要包扫描路径覆盖到位,加上对应注解,Spring 就能完成 Bean 创建与注入。


















