Spring、Spring Boot、Spring MVC 到底是不是一个容器?一次说清楚 📅 发布时间:2026/7/7 13:26:11 👁️ 浏览次数: 目录一、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 只是围绕容器提供的不同能力。
内网---> ReadGMSAPassword权限滥用 目录 🔑 什么是 gMSA(Group Managed Service Account) ⚠️ ReadGMSAPassword 权限的真实作用 🛡️ 为什么这个权限在内网渗透中极度危险 🗺️ 利用流程文本图(攻击链) 🛠️ 实际利用方式与工具演示 方式一:PowerShell 原生提取(推荐,最隐蔽) 方式二:使… 2026/5/17 12:21:31
延迟函数/协同程序/多线程/特殊文件夹/资源加载/异步加载资源或场景/LineRender/范围检测/射线检测 延迟函数 定义:延迟函数是MonoBehaviour基类提供的可以延时执行的函数特点: 可以自定义要执行的函数和延迟时间继承MonoBehaviour后即可使用通过反射机制根据函数名查找并执行对应方法 延迟函数的使用 //Invoke() //参数一:函数名 字符串… 2026/7/3 4:48:18
优选算法——二分查找 👇作者其它专栏 《数据结构与算法》《算法》《C起始之路》 二分查找相关题解 1.二分查找 算法思路: a.定义left,right指针,分别指向数组的左右区间。 b.找到待查找区间的中间点mid,找到后分三种情况讨论ÿ… 2026/7/4 5:46:29
Web安全三大漏洞CRLF、CSRF、SSRF:从原理到实战防御指南 1. 项目概述:从零开始理解三大Web安全漏洞在Web安全领域,有三个缩写词让无数开发者和安全工程师又爱又恨:CRLF、CSRF和SSRF。它们不像SQL注入或XSS那样“声名显赫”,却常常是渗透测试报告中的“常客”,也是许多中高级漏… 2026/7/7 13:24:30
终极微信聊天记录导出指南:3步轻松备份你的珍贵记忆 终极微信聊天记录导出指南:3步轻松备份你的珍贵记忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心手机丢失或更换设备时,那些珍贵的微… 2026/7/7 13:22:30
Java安全编码实战:9步构建纵深防御体系,从输入验证到漏洞管理 1. 项目概述:为什么我们需要一本Java安全编码实战手册?在Java世界里摸爬滚打了十几年,我见过太多因为安全编码意识薄弱而引发的“血案”。从简单的SQL注入导致数据泄露,到复杂的反序列化漏洞让整个内网沦陷,这些事故的… 2026/7/7 13:22:30
一文搞懂 AI Agent 的记忆系统:从短期到长期,从本地到向量数据库 TL;DR:AI Agent 为什么能「记住」你之前说的话?背后的记忆系统分为三层:短期记忆(上下文窗口)、长期记忆(向量数据库)、工作记忆(当前会话状态)。本文详解三层记忆的原理… 2026/7/7 13:22:30
各种小技巧大杂烩 1. 跳到 conda 的根目录 cd $(dirname $(dirname $(which conda)))2. 使用 git diff 直接比较两个文件 git diff --no-index old_file new_file3. 查看 pkl 的内容 import pickle as pkl with open("remember_use_rb.pkl", "rb") as f:data pkl.load(f)pr… 2026/7/7 13:18:26
173、 PCIE等长布线:从时序乱飞到链路稳定 173、 PCIE等长布线:从时序乱飞到链路稳定 调试间里烟雾缭绕——这不是夸张,上周真烧了块板子。问题出在x4的PCIE链路上:第三通道死活训练不到Gen3速度,插上设备要么识别成Gen1,要么直接枚举失败。用示波器抓眼图,发现第三条lane的眼宽明显塌陷,时钟抖动异常。折腾两天… 2026/7/7 13:18:26
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58