当前位置: 首页 > news >正文

面试问题controller和service能不能互相替换

之前面试的时候遇到的问题

能替换(语法上能跑),但绝对不能替换(架构上绝对不行)

1. 语法上:确实能互换

从 Spring 源码看:

  • @Controller
  • @Service
  • @Repository
  • @Component

底层全部都是 @Component!全部都会被 Spring 管理,全部能注入,全部能调用。

所以:

你把 @Controller 改成 @Service,项目照样跑!

你把 @Service 改成 @Controller,也能跑!

2. 但!真正的区别不是规范,是【Spring 给它们加的特殊功能】

这才是面试官想听的!

@Controller 有额外功能:能接收前端请求

只有加了@Controller/@RestControllerSpringMVC 才会:

  • 扫描里面的@RequestMapping/@GetMapping
  • 把方法暴露成接口
  • 让前端能访问

@Service 没有这个功能!你把 Controller 改成 Service前端立刻访问不了!接口全部失效!

@Service 有额外功能:AOP / 事务 / 日志增强

Spring 会对@Service做很多增强:

  • 事务@Transactional
  • 日志
  • 监控
  • 异步
  • 缓存
  • AOP 切面

这些增强默认只针对 Service 层

Controller 一般不做这些增强。


@Mapper / @Repository 是给 MyBatis 用的

是为了让框架知道:这个类是干嘛的,应该给它开什么功能

  • 生成 DAO 代理
  • 连接数据库
  • 执行 SQLController 和 Service 做不了。

    职责分离 + 功能增强 + 框架识别

  • Controller = 接收请求SpringMVC 只认它
  • Service = 处理业务事务、AOP 只认它
  • Mapper = 操作数据库MyBatis 只认它

你应该这样回答(满分答案):

** 语法上可以互换,因为底层都是 @Component;

但实际项目中绝对不能互换,原因有三点:**

  • @Controller 会被 SpringMVC 管理,用于接收前端请求,提供接口;
  • @Service 用于业务逻辑,支持事务、AOP 等增强功能;
  • 两者职责不同,框架赋予的功能不同,互换会导致接口不可用、事务失效、架构混乱。
http://www.jsqmd.com/news/519983/

相关文章:

  • 列线图/诺莫图 含概率轴
  • 基于云平台的毕业设计:从零构建高可用 Web 应用的技术选型与实践
  • GlyEngine:嵌入式Lua引擎的零堆内存与跨平台实现
  • Java多线程学习(五)
  • AutoGen Studio效果展示:Qwen3-4B-Instruct-2507驱动的自动化法律合同审查Agent案例
  • 前端学习之HTML5+CSS3基础
  • 嵌入式OBDII CAN驱动库:物理层接入与多帧解析实战
  • 手把手教你用R-Studio Technician搭建个人数据恢复工作站(附硬件清单与避坑指南)
  • 多分类任务中SHAP特征重要性可视化:从summary_plot报错到实战调优
  • 嵌入式OTA升级失败率下降83%的关键:用C语言实现可验证状态机(含完整FSM状态迁移图与超时自愈逻辑)
  • cv_resnet18_ocr-detection ONNX导出实战:跨平台部署,C++/Java都能用
  • K8S 控制器-资源调度-叩丁狼
  • 魔搭社区实战:零代码玩转Qwen2.5-3B-Instruct-GGUF云端部署
  • 告别C#,我用Python+PyCharm+AutoCAD搞定了CAD二次开发(附完整代码)
  • GLM-OCR多模态识别模型:从零开始快速部署与测试
  • MuMu模拟器+Edge浏览器:H5页面元素定位的实战指南
  • 终极指南:如何用StardewXnbHack一键解锁《星露谷物语》所有游戏资源
  • FeRAM嵌入式驱动库:轻量、实时、线程安全的铁电存储控制方案
  • Qwen3-0.6B-FP8企业应用:法律合同初稿生成+关键条款提示双模协同案例
  • 第五章 渲染管线
  • 液驱剪叉电气系统拆解:从ECU到线束的保姆级指南(附LGMG AS1212实例)
  • Alpamayo-R1-10B作品集:10组高难度长尾场景(鬼探头、视线遮挡、异形车辆)应对案例
  • OpenClaw多终端控制:通过飞书管理GLM-4.7-Flash任务实践
  • 别再乱接AGND和DGND了!手把手教你搞定数模混合电路的地平面设计(附PCB布局实例)
  • MogFace人脸检测模型-WebUI作品:100%覆盖侧脸/低头/遮挡/运动模糊的挑战样本集
  • 嵌入式轻量级参数存储:带校验码与Code ID的EEPROM偏好管理
  • 告别微信QQ!用群晖NAS+Vocechat搭建你的私人聊天室(附Cpolar内网穿透教程)
  • AI Studio上传大文件太慢?教你用Python脚本批量解压zip文件(附完整代码)
  • 用robomimic玩转机器人模仿学习:从数据采集到策略部署全流程解析(2024最新版)
  • 论快速排序的时间复杂度