手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

12|再回首:如何实现Spring MVC?

你好,我是郭屹。
恭喜你学完 MiniSpring 的第二部分——MVC 了。你是不是跟着我的脚步自己也实现了一个 MVC 呢?如果已经完成了,欢迎你把你的实现代码放到评论区,我们一起交流讨论。
为了让你更好地掌握这部分内容,我们来对这一整章做一个重点回顾。

MVC 重点回顾

MVC 是 Spring 框架的核心组成部分之一,负责实现一个 Web 应用程序的模型视图控制器模式。Spring 框架提供了丰富的组件和工具,而 MVC 负责处理一个 Web 应用程序中的核心过程,例如请求处理、数据转换、模板渲染和视图管理等。而 MVC 和 Spring 的结合,就像是车与引擎的结合一样,给 Web 应用程序提供了强大而且可靠的性能和灵活性,让我们能够快速、方便地搭建高性能、可靠的 Web 应用程序。
因为 Spring 是 Java 实现的,也因为发明人 Rod Johnson 先生自己是 Java 团队 Servlet 规范的专家组成员,所以很自然,他的 MVC 的实现是基于 Servlet 的。利用 Servlet 的机制,把这种功效发挥到了极致,快速构造了完整的 Web 程序结构,让我们大开眼界。

那我们在课程中是怎么实现 MVC 的呢?

首先我们利用 Servlet 机制,用一个单一的 Servlet 拦截所有请求,由它来分派任务,这样实现了原始的 MVC 结构。然后呢,我们把 MVC 和 IoC 结合在一起,在 Servlet 容器启动的时候,给上下文环境里注入 IoC 容器,使得在 Servlet 里可以访问到 IoC 容器里的 Bean。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring MVC是Spring框架的核心组成部分之一,负责实现Web应用程序的模型视图控制器模式。本文通过回顾MVC的重点内容,介绍了如何在Spring框架中实现MVC。首先,利用Servlet机制实现了原始的MVC结构,然后将MVC和IoC结合,实现了在Servlet容器启动时向上下文环境注入IoC容器,使得在Servlet中可以访问IoC容器中的Bean。接着,通过解耦MVC结构,独立出请求处理器,并使用注解方式将Web请求定位到后台处理的类和方法中,实现了Spring的RequestHandler。此外,还实现了数据参数的自动转换和数据绑定功能,以及将处理结果返回到前端的功能。文章还提出了一些思考题,引导读者深入思考和交流讨论。总的来说,本文通过具体的实现细节和思考题,帮助读者更好地理解了Spring MVC的实现原理和技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • Geek_320730
    https://github.com/kuifir/practice/tree/master/miniSpring 跟着老师每节课程跟着学完都很有收获,完成一个课程的内容并且测试成功后也很有成就感。

    作者回复: 动手是诀窍,事情要经过手才行。

    2023-04-11归属地:北京
    4
  • 欧阳利
    怎么感觉越到后面,内容越简单了

    作者回复: 这就是我希望的效果,跟一遍之后就懂了Spring框架。

    2023-04-11归属地:广东
    1
  • peter
    请教老师几个问题: Q1:SpringMVC与Spring是什么关系? SpringMVC是Spring的一个子模块或子组件吗?或者两者不是包含关系,是平等、相互独立的两个东西? Q2:SpringMVC是基于servlet,可以基于其他的吗? Q3:SpringMVC需要依赖于一个容器,比如tomcat,但spring不需要依赖tomcat,是这样吗? Q4:servlet具体是一个进程还是一个线程? Redis速度快,因为是单线程,现在servlet处理全部请求,是不是类似于redis的单线程? Q5:前后盾分离开发,前端用vue,应该会有一个“vue引擎”一类的东西。前端开发完成后,页面会打包放到后端idea项目中,那么,此时,后端会有一个“vue引擎”吗? Q6:wac访问不到servlet,是不需要吗?还是技术上不可行?可以把wac放到ServletContext中,为什么不可以把DispatchServlet放到wac中?

    作者回复: 一并回答如下。spring mvc是spring的一个模块。它的实现是用的servlet,也可以使用filter来实现的。Spring mvc是web框架,所以要在web容器具体来讲是servlet容器如Tomcat中运行。Spring是一个大体系,狭义的核心Spring IoC是不依赖于Tomcat的。servlet是一个线程,不是单线程的。前后端分离了,后端不需要vue引擎的。wac和dispatcherservlet的关系是上下游的关系或者说是上下层的关系,软件体系结构是一层层的,一般是上层访问下层。Visual Basic的发明人说过:软件是一个地质学堆积过程。

    2023-04-08归属地:北京
    2
  • Jay
    请教老师,有个问题一直没想明白,RequestMappingHandlerMapping和RequestMappingHandlerAdapter都是配置在applicationContext.xml里面由IOC容器管理的,DispatcherServlet中通过wac.getBean()方法获取,这一步没有问题。但是,RequestMappingHandlerMapping依赖的WebApplicationContext必须是MVC容器(initMapping方法中需要获取MVC容器中维护的controllerNames),我一直没有看到RequestMappingHandlerMapping依赖的这个wac是如何注入的。master代码里面实现了ApplicationContextAware接口,但是我想即便实现了这里也只能得到IOC容器对应的ApplicationContext,好像依然不能解决这个问题?不知道到我理解的有没有问题?

    作者回复: refresh的时候初始化这两个东西: protected void Refresh() { initHandlerMappings(this.webApplicationContext); initHandlerAdapters(this.webApplicationContext); initViewResolvers(this.webApplicationContext); } 而这个wac是在dispatcherservlet init的时候创建的: public void init(ServletConfig config) throws ServletException { super.init(config); this.parentApplicationContext = (WebApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); this.sContextConfigLocation = config.getInitParameter("contextConfigLocation"); this.webApplicationContext = new AnnotationConfigWebApplicationContext(this.sContextConfigLocation,this.parentApplicationContext);

    2023-04-07归属地:美国
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部