Skip to content

Spring 和 Spring MVC 的关系是什么? ​

  • 标签:后端、Spring

🏛 业务架构师 ​

Spring 和 Spring MVC 是平台与模块的关系:

  • Spring 是基础框架全家桶:IOC 容器、AOP、事务抽象、数据访问……解决"对象管理、解耦、一致性"这些与协议无关的核心问题;
  • Spring MVC 是 Spring 生态里的 Web 模块(spring-webmvc),基于 Spring 的 IOC/AOP,专门解决"HTTP 请求如何进入应用、路由、参数绑定、响应渲染"这一层问题。它依赖 Spring 而非反过来——MVC 的 Controller 也是容器里的 Bean,享受注入和切面增强。

我习惯用分层讲清职责边界:Spring 管"业务内核"(Service、Repository、事务),Spring MVC 管"接入表皮"(协议适配、请求分发)。Controller 应该薄——参数校验、调 Service、组装响应,业务规则绝不写进 Controller,这样同一套业务内核可以被 MVC、RPC(Dubbo)、MQ Listener、定时任务多种入口复用——这才是这个关系背后真正值钱的架构原则。

2026 视角再补一层:今天说"Spring"实际默认是 Spring Boot(自动配置 + 内嵌容器交付),Spring Cloud 在其上做微服务治理。四者关系一句话:Framework 是地基,Boot 是交付方式,MVC 是 Web 接入层,Cloud 是分布式治理套件——面试能把这条演进线讲清楚,就跳出了知识点背诵。

🏗 系统架构师 ​

父子关系,依赖方向单一:Spring Framework 是内核(IoC/AOP/事务/抽象层),Spring MVC 是构建在 spring-context 与 Servlet API 之上的 Web 模块,只是 Spring 体系在 Web 交互形态上的一个「前端适配器」。

这个关系背后的架构原则是我回答的重点:业务核心不应感知 Web:

  • Service/Domain 层只依赖 Spring 内核能力(事务、事件),不出现 HttpServletRequest、HttpSession 等 Web 类型;
  • 好处:同一套核心逻辑可以被多种前端复用——HTTP Controller、gRPC 服务、MQ 消费者、定时任务入口,各自只是不同协议的适配层(六边形架构的端口与适配器思想);
  • 我评审时看到 Service 里出现 Servlet API 就要求整改——它意味着核心逻辑被锁死在 Web 容器里,未来加 RPC 入口就得重写。

补一句演进:Boot 是把 Spring 加 MVC 的装配自动化的产品层。三者关系即内核、Web 适配、自动装配工厂。

💻 全栈开发专家 ​

一句话:Spring 是框架内核(IOC + AOP 容器),Spring MVC 是构建在它之上的 Web 模块。

依赖关系上,spring-webmvc 只是 Spring Framework 的一个 jar(依赖 spring-web、spring-context 等)。MVC 里的 Controller、HandlerMapping 全是容器里的普通 Bean,享受统一的依赖注入、生命周期、AOP 增强——所以同一个 Controller 方法上能同时看到 @Autowired 注入和 @Transactional 事务,这就是"同一容器"的直接证据。

广义的 Spring 是生态:Framework(内核)→ Boot(自动配置 + 内嵌容器)→ Cloud(微服务治理)→ 领域子项目(Data/Security/Batch)。MVC 在 Boot 里就是 web 场景的默认实现(引 spring-boot-starter-web 即得),换成 WebFlux 则是另一套响应式栈,同根不同枝。

常被追问的点:为什么 MVC 能和 IOC 融合?——DispatcherServlet 初始化时从 WebApplicationContext 里找 HandlerMapping/HandlerAdapter,handler 注册、参数解析器全走容器。理解这层关系后,"Boot 里还有父子容器吗"(没有,单容器)这类延伸题自然就通了。