我先直接回答核心结论,再一步步拆解,帮你理清 Spring Boot、Web、MVC 之间的关系:
核心结论
- 不是必须写 Controller 才能启动端口:只要引入
spring-boot-starter-web,即使没有任何 Controller,Spring Boot 也会启动 Tomcat 服务器并监听端口(默认 8080); - Spring Boot 不是“不需要 MVC”:而是帮你自动配置好了 MVC,你不用手动配置 XML/注解扫描等,但开发接口本质上还是基于 Spring MVC 框架。
1. 先验证:没有 Controller 也能启动端口
只要你的 pom.xml 引入了 spring-boot-starter-web,哪怕项目里只有启动类,启动后也会看到端口日志:
// 仅启动类,无任何 Controller
package com.sotest.JavaJni;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JavaJniApplication {
public static void main(String[] args) {
SpringApplication.run(JavaJniApplication.class, args);
}
}
启动日志会出现:
2026-03-09T15:XX:XX.XXX+08:00 INFO XXXXX --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
此时端口 8080 是通的(只是没有可访问的接口,访问 http://localhost:8080 会返回 404)。
2. 为什么说“Spring Boot 没抛弃 MVC”?
你可能误解了“Spring Boot 简化配置”的含义:
- 传统 Spring MVC:需要手动配置
DispatcherServlet、视图解析器、组件扫描、XML 文件等,步骤繁琐; - Spring Boot + Web:引入
spring-boot-starter-web后,自动配置(AutoConfiguration)会帮你完成所有 MVC 核心组件的初始化:- 自动注册
DispatcherServlet(请求分发核心); - 自动配置 JSON 序列化(Jackson);
- 自动扫描当前包下的
@Controller/@RestController; - 自动启动 Tomcat 服务器。
- 自动注册
简单说:Spring Boot 是“封装了 MVC”,不是“不需要 MVC”,开发接口的核心注解(@RestController、@GetMapping、@PostMapping)本质上都是 Spring MVC 的注解。
3. 什么时候需要写 Controller?
只有当你需要对外提供具体的 HTTP 接口时,才需要写 Controller:
- 没有 Controller:端口启动了,但没有可访问的接口(访问任何路径都是 404);
- 有 Controller:端口 + 具体接口,才能实现“提供接口”的核心需求。
4. 补充:非 MVC 方式提供接口(可选)
如果你确实不想用 Spring MVC,也可以通过其他方式(比如原生 Servlet)提供接口,但这违背了 Spring Boot 的设计初衷,且更繁琐:
package com.sotest.JavaJni;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import java.io.IOException;
@SpringBootApplication
@ServletComponentScan // 扫描 Servlet 注解
public class JavaJniApplication {
public static void main(String[] args) {
SpringApplication.run(JavaJniApplication.class, args);
}
// 原生 Servlet 接口
@WebServlet("/hello")
public static class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello from Servlet!");
}
}
}
这种方式虽然不用 Controller/MVC,但代码更冗余,也失去了 Spring MVC 的便捷性(比如参数自动绑定、JSON 自动序列化)。
总结
- 启动端口的核心是
spring-boot-starter-web依赖(自动启动 Tomcat),和是否写 Controller 无关; - Spring Boot 没有“抛弃 MVC”,而是自动配置了 MVC 框架,
@RestController/@GetMapping等注解本质还是 MVC 体系; - 写 Controller 是 Spring Boot 开发接口的标准、最简方式,无需额外配置,推荐使用。
简单来说:引入 spring-boot-starter-web = 启动端口;写 Controller = 提供可访问的接口。
浙公网安备 33010602011771号