Spring、Spring Boot、Spring MVC 到底是不是一个容器?一次说清楚

📅 发布时间:2026/7/7 13:26:11 👁️ 浏览次数:
Spring、Spring Boot、Spring MVC 到底是不是一个容器?一次说清楚
目录一、Spring、Spring Boot 与 Spring MVC 的容器层级关系解析二、什么是 Spring 容器2.1 Spring容器的理解2.2 Spring 容器的工作流程2.3 Spring 容器的一些缺点三、Spring Boot 是容器吗3.1 Spring Boot容器的理解3.2 Spring Boot 容器与Spring 容器的关系3.3 是不是引入springboot后无需在引入spring容器四、Spring MVC 是容器吗4.1 Spring MVC的理解4.2 Spring MVC的核心组件有哪些1️⃣DispatcherServlet前端控制器2️⃣HandlerAdapter处理器适配器3️⃣Controller控制器4️⃣ModelAndView5️⃣ViewResolver视图解析器6️⃣View视图4.3 Spring MVC 的工作流程4.4 为什么很多人会说 “Spring MVC 容器”五、总结在实际开发中“Spring 容器”“Spring Boot 容器”“Spring MVC 容器”这些说法经常被混在一起使用甚至被当作同一个概念来理解。但当我们真正去分析启动流程、Bean 加载或请求处理链路时却发现它们并不完全等价。事实上三者并不是并列的容器实现而是围绕 Spring IoC 容器在不同层面上的分工与封装。本文将从容器的本质出发系统梳理 Spring、Spring Boot 与 Spring MVC 之间的关系回答一个常见却容易被误解的问题它们到底是不是一个容器一、Spring、Spring Boot 与 Spring MVC 的容器层级关系解析在理解 Spring、Spring Boot 与 Spring MVC 之间的区别之前首先需要明确一个前提三者并不是“大小关系”也不是三套彼此独立的容器实现而是一种清晰的层级嵌套关系。从底层到上层可以按照如下结构进行理解JVM 层类加载机制ClassLoader负责加载 .class 字节码Spring 容器以 ApplicationContext 为核心的 IoC 容器Spring Boot 容器对 Spring 容器的启动、配置与运行过程进行封装和增强Spring MVC 容器专注于 Web 请求处理的子容器。这一层级结构决定了各个“容器”在系统中的职责边界也解释了为什么它们经常被误解为同一个概念。二、什么是 Spring 容器2.1 Spring容器的理解如果只谈“容器”真正意义上的容器其实只有一个Spring IoC 容器Spring 容器的核心职责是创建对象Bean管理对象生命周期维护对象依赖关系统一管理组件Spring 容器的核心接口是ApplicationContext常见实现包括AnnotationConfigApplicationContextClassPathXmlApplicationContextWebApplicationContext例如ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class); UserService userService context.getBean(UserService.class);在这个过程中Spring 扫描 Bean创建对象注入依赖管理生命周期因此Spring 容器的本质是 IoC控制反转容器。2.2 Spring 容器的工作流程1️⃣ 配置 Bean首先需要向 Spring 容器提供 Bean 的配置信息常见方式包括XML 配置注解配置Component、Service、Bean 等Java Config 配置类这些配置描述了 Bean 的类型、作用域以及依赖关系。2️⃣ 启动容器当 Spring 应用启动时框架会创建 IoC 容器并加载 Bean 配置。例如ApplicationContext context new ClassPathXmlApplicationContext(applicationContext.xml);在这一阶段Spring 会读取配置文件或扫描注解并将 Bean 定义加载到容器中。3️⃣ 实例化 Bean容器根据读取到的 Bean 定义信息创建对象实例。对于单例 Beansingleton通常会在容器启动时完成实例化。4️⃣ 依赖注入Dependency Injection在 Bean 创建完成后Spring 会根据配置将依赖对象注入到当前 Bean 中例如构造方法注入Setter 注入注解注入Autowired这一过程实现了控制反转IoC即对象依赖关系由容器统一管理。5️⃣ Bean 初始化如果 Bean 定义了初始化方法例如实现InitializingBean使用PostConstruct配置init-method则 Spring 会在依赖注入完成后调用这些初始化方法。6️⃣ 使用 Bean应用程序可以通过容器获取 Bean 并使用例如UserService userService context.getBean(UserService.class);此时 Bean 已经完成创建、依赖注入和初始化可以被正常使用。7️⃣ 销毁 Bean当 Spring 容器关闭时会执行 Bean 的销毁逻辑例如实现DisposableBean使用PreDestroy配置destroy-method该阶段通常用于释放资源如数据库连接、线程池等。2.3 Spring 容器的一些缺点以前使用Spring SpringMVC时需要1️⃣ 写大量 XMLbean iduserService classcom.demo.UserService/2️⃣ 配置 web.xmllistener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener3️⃣ 配置 DispatcherServletservlet servlet-namespringmvc/servlet-name /servlet4️⃣ 还要部署到Tomcat整个启动流程非常复杂。由此可以看出传统 Spring 项目的启动和配置过程较为复杂需要编写大量配置文件并手动部署到 Tomcat。为了解决这些问题Spring Boot 提供了一套更加简化的启动机制使开发者能够快速构建和运行 Spring 应用。三、Spring Boot 是容器吗3.1 Spring Boot容器的理解严格来说Spring Boot 并不是一个容器。Spring Boot 本质上是一个用于快速启动 Spring 容器并完成自动配置的启动框架通过约定优于配置的方式简化了传统 Spring 应用复杂的初始化过程。Spring Boot 的核心作用是自动配置简化启动简化依赖管理内嵌 Web 服务器Spring Boot 只是对 Spring 容器的启动过程进行封装。典型启动类SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }SpringApplication.run()的本质其实是创建ApplicationContext加载自动配置扫描 Bean启动容器因此可以理解为Spring Boot 是Spring 容器的启动器Bootstrap Framework它并没有重新实现 IoC 容器。3.2 Spring Boot 容器与Spring 容器的关系Spring Boot 不是“容器”真正的容器只有Spring 容器IoC Container。两者之间的关系是Spring提供 IoC 容器Spring Boot负责快速启动和自动配置 Spring 容器Spring 容器可以理解为汽车中的发动机系统而 Spring Boot 则类似于汽车中的一键启动与自动驾驶辅助系统它并没有改变发动机本身而是通过自动配置和启动机制使应用能够更加便捷地运行。3.3 是不是引入springboot后无需在引入spring容器引入 Spring Boot 后不需要再单独引入 Spring 容器依赖但 Spring 容器仍然存在只是被 Spring Boot 自动引入并启动了。如果使用传统 Spring 项目一般需要手动引入 Spring 核心依赖例如dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId /dependency因为Spring 容器的核心就在spring-context。而在Spring Boot 项目中通常只需要引入dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency或者 Web 项目dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency这些Starter 依赖内部已经包含了 Spring 的核心依赖。如果想自己写一个SpringBoot Starter参照我之前的博文“自己动手写一个 Spring Boot Starter其实没那么神秘”例如spring-boot-starter-web ├─ spring-boot-starter │ ├─ spring-context │ ├─ spring-beans │ ├─ spring-core │ └─ spring-expression ├─ spring-web └─ spring-webmvc所以Spring Boot Starter 已经把 Spring 容器依赖自动引入了。因此开发者不需要再手动添加 Spring 依赖。四、Spring MVC 是容器吗4.1 Spring MVC的理解Spring MVC 本质上是一个Web MVC 框架用于处理 HTTP 请求。Spring MVC 是在 Spring 容器基础上构建的 Web 框架用于处理 HTTP 请求并实现 MVCModel–View–Controller模式。Spring MVC 通过一系列组件协同工作完成请求分发、业务处理以及视图渲染等过程。4.2 Spring MVC的核心组件有哪些核心组件包括1️⃣DispatcherServlet前端控制器DispatcherServlet是 Spring MVC 的核心组件也是整个请求处理流程的入口。所有 HTTP 请求都会首先进入DispatcherServlet由它统一进行调度与分发。HandlerMapping处理器映射器HandlerMapping的作用是根据请求 URL 查找对应的处理器Controller。它负责建立请求路径与 Controller 方法之间的映射关系。2️⃣HandlerAdapter处理器适配器不同类型的 Controller 可能具有不同的调用方式HandlerAdapter的作用是通过适配器模式统一调用 Controller 的处理方法。简单来说HandlerMapping 负责找到 ControllerHandlerAdapter 负责执行 Controller。3️⃣Controller控制器Controller 是 Spring MVC 中用于处理业务逻辑的组件它负责接收请求参数、调用业务层Service并返回处理结果。例如Controller public class UserController { GetMapping(/user) public String getUser(Model model) { model.addAttribute(name, Tom); return user; } }4️⃣ModelAndViewModelAndView用于封装模型数据Model和视图信息View。Model要传递给页面的数据View需要渲染的页面名称例如return new ModelAndView(user, name, Tom);5️⃣ViewResolver视图解析器当 Controller 返回视图名称时ViewResolver会根据视图名解析出真实的视图页面例如user → /WEB-INF/views/user.jsp6️⃣View视图View 负责最终的数据展示例如JSPThymeleafHTML视图会根据 Model 中的数据生成最终的页面内容。典型请求流程如下HTTP Request ↓ DispatcherServlet ↓ HandlerMapping ↓ Controller ↓ Service ↓ ResponseSpring MVC 依赖 Spring 容器来管理组件例如Controller public class UserController { Autowired private UserService userService; }4.3 Spring MVC 的工作流程Spring MVC 通过多个组件协同工作完成一次完整的请求处理流程其主要步骤如下。1️⃣ 用户请求用户在浏览器中发起 HTTP 请求请求首先到达DispatcherServlet它是整个 Spring MVC 请求处理流程的统一入口。Browser → DispatcherServlet2️⃣ 请求分发DispatcherServlet 根据请求 URL 调用 HandlerMapping查找与之匹配的 Controller。3️⃣ 执行控制器方法当找到对应的 Controller 后DispatcherServlet会通过HandlerAdapter调用具体的 Controller 方法执行业务逻辑。HandlerAdapter → Controller4️⃣ 返回处理结果Controller 方法执行完成后会返回处理结果通常有以下几种形式返回ModelAndView返回视图名称使用ResponseBody直接返回JSON 数据5️⃣ 视图解析如果返回的是视图名称Spring MVC 会调用ViewResolver视图解析器将逻辑视图名解析为具体的视图页面例如user → /WEB-INF/views/user.jsp6️⃣ 视图渲染解析完成后View 会根据Model 中的数据进行页面渲染生成最终的 HTML 页面。7️⃣ 响应返回最终生成的页面或数据会通过DispatcherServlet 返回给浏览器完成整个请求处理流程。View → DispatcherServlet → Browser4.4 为什么很多人会说 “Spring MVC 容器”在 Web 应用中经常会出现两个容器Root ApplicationContext由 Spring 创建管理ServiceRepositoryDataSourceTransactionManager业务组件WebApplicationContext由 Spring MVC 创建管理ControllerHandlerMappingHandlerAdapterViewResolver结构如下Root ApplicationContext ↑ WebApplicationContext这也是很多人说“Spring MVC 容器”的原因。两者之间的访问关系是什么子容器可以访问父容器Controller → Service但父容器不能访问子容器。五、总结在实际开发中Spring、Spring Boot 和 Spring MVC 经常被统称为“Spring 体系”但从技术结构上来看它们承担着不同的职责Spring提供 IoC 容器是整个框架的核心基础Spring Boot负责容器启动与自动配置简化开发流程Spring MVC构建 Web 请求处理框架实现 MVC 模式因此真正意义上的“容器”只有 Spring IoC 容器。Spring Boot 和 Spring MVC 只是围绕容器提供的不同能力。