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

08|整合IoC和MVC:如何在Web环境中启动IoC容器?

你好,我是郭屹。
通过上节课的工作,我们就初步实现了一个原始的 MVC 框架,并引入了 @RequestMapping 注解,还通过对指定的包进行全局扫描来简化 XML 文件配置。但是这个 MVC 框架是独立运行的,它跟我们之前实现的 IoC 容器还没有什么关系。
那么这节课,我们就把前面实现的 IoC 容器与 MVC 结合在一起,使 MVC 的 Controller 可以引用容器中的 Bean,这样整合成一个大的容器。

Servlet 服务器启动过程

IoC 容器是一个自我实现的服务器,MVC 是要符合 Web 规范的,不能自己想怎么来就怎么来。为了融合二者,我们有必要了解一下 Web 规范的内容。在 Servlet 规范中,服务器启动的时候,会根据 web.xml 文件来配置。下面我们花点时间详细介绍一下这个配置文件。
这个 web.xml 文件是 Java 的 Servlet 规范中规定的,它里面声明了一个 Web 应用全部的配置信息。按照规定,每个 Java Web 应用都必须包含一个 web.xml 文件,且必须放在 WEB-INF 路径下。它的顶层根是 web-app,指定命名空间和 schema 规定。通常,我们会在 web.xml 中配置 context-param、Listener、Filter 和 Servlet 等元素。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何在Web环境中启动IoC容器,实现IoC容器与MVC的整合。通过详细讲解Servlet服务器启动过程和利用Listener初始化启动IoC容器的方法,读者可以清晰了解在Tomcat启动时同时启动IoC容器的实际操作方法。文章还介绍了WebApplicationContext接口和AnnotationConfigWebApplicationContext类的定义,以及配置文件applicationContext.xml的作用和示例。通过这些步骤,实现了IoC容器与MVC的整合,使MVC的Controller可以引用容器中的Bean,从而实现了一个大的容器。整合的核心原因是Servlet规范中规定的时序,为读者展示了构建可扩展体系的思路。文章还提供了相关代码和配置文件的示例,方便读者进行实际操作和测试。整体而言,本文为读者提供了在Web环境中启动IoC容器的实际操作方法,并展示了如何构建可扩展体系的思路。

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

全部留言(12)

  • 最新
  • 精选
  • 风轻扬
    思考题:Spring中有父子容器的概念。子容器:MVC容器,父容器:Spring容器。子可以访问父,反过来不行,这是由Spring的体系结构决定的,子容器继承父容器,所以子容器是知道父容器的,所以也就能得到父容器的引用,进而得到父容器中的bean。但是父容器是无法知道子容器的,所以也就无法直接获取子容器中的bean,但是可以通过getBeanFactory来得到子容器,从而获取到子容器中的bean,但java的三层模型,controller--->service--->dao,controller注入service对象是正常的,service注入controller有点奇怪,一般不这么干。不知道以上理解的对不对

    作者回复: 很对。

    2023-04-03归属地:北京
    6
  • 睿智的仓鼠
    文中代码实现了webApplicationContext的注入,但排版缺少了很重要的 populateBean()方法,没有使用到初始化好的ioc容器,github中相关的完整的代码是: ```java DispatcherServlet: protected void initController() { this.controllerNames = scanPackages(this.packageNames); for (String controllerName : this.controllerNames) { Object obj = null; Class<?> clz = null; try { clz = Class.forName(controllerName); obj = clz.newInstance(); } catch (Exception e) { e.printStackTrace(); } this.controllerClasses.put(controllerName, clz); populateBean(obj); this.controllerObjs.put(controllerName, obj); } } // 处理controller中的@Autowired注解 private void populateBean(Object bean) { Class<?> clz = bean.getClass(); Field[] fields = clz.getDeclaredFields(); for (Field field : fields) { boolean isAutowired = field.isAnnotationPresent(Autowired.class); if (isAutowired) { String fieldName = field.getName(); Object autowiredBean = this.webApplicationContext.getBean(fieldName); field.setAccessible(true); try { field.set(bean, autowiredBean); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } } ```

    作者回复: 感谢感谢。

    2023-03-29归属地:湖北
    4
  • 不是早晨,就是黄昏
    最后,在 com.minis.test.HelloworldBean 内的测试方法上 但是你项目代码里有新建了一个test目录,且是和minis同级,而minisMVC-servlet.xml里配置的也是com.test,文章给的代码也是com.test里的,感觉写的有点过于随意了。。。。

    作者回复: 多谢指正。

    2023-04-04归属地:河南
    2
  • Cooler
    老师,目前wac.setServletContext(servletContext); 这一块相关代码是不是没有用在这一章讲的内容

    作者回复: 用到了

    2023-06-16归属地:上海
  • 啊良梓是我
    课后题,通过WebApplicationContext 可以访问到DispatcherServlet里面的bean吗? 我觉得是分成两种情况来讲的? 根据Servlet的时序来讲的话,那么当初始化好WebApplicationContext的时候,DispatcherServlet还没有进行初始化,所以是空的无法访问的; 但是Servlet初始化完成后呢那应该是可以的?但是怎么访问?用一个方法? 这个方法怎么表明他是IOC的bean的?有点乱了

    作者回复: 你往后面看再回首的时候,有这一部分的解释。

    2023-05-18归属地:广东
  • 啊良梓是我
    黑夜模式,代码里面的标签全没了,作者可以跟后台反馈一下吗 改一下颜色啥的

    作者回复: 好的

    2023-05-18归属地:广东
  • Geek_b71d2c
    老师,请问一下servletContext.getInitParameter(CONFIG_LOCATION_PARAM)一直获取到的是空,这是什么原因呀

    作者回复: web.xml文件中的初始化参数没给吧?参考Github上的

    2023-05-06归属地:北京
  • 杨松
    老师,在代码分支geek_mvc2中,ContextLoaderListener加载了资源文件applicationContext.xml中的bean对象,然后DispatcherServlet会加载/WEB-INF/minisMVC-servlet.xml并扫描包com.test,那么这个包下的对象即被ioc容器加载了,又被DispatcherServlet(mvc容器)加载了,是不是后续的分支会解决这个问题

    作者回复: 分开的, mvc容器的配置文件和ioc的不同,从mvc容器中可以访问到ioc容器。

    2023-04-18归属地:辽宁
  • peter
    请教老师几个问题: Q1:我用idea2019创建的后端项目并没有web.xml,为什么? 我创建的是springboot项目,maven项目,src目录下面是main和test,main下面是java和resource,并没有WebContent目录,也没有WEB_INF目录,更没有web.xml文件。这个现象怎么解释?另外,不同的项目有不同的目录结构,目录结构的定义在哪里有官方说明? Q2:用idea创建的项目缺省是基于tomcat吗? Q3:spring必须基于tomcat,不能独立工作吗? 按文中的说法,servlet必须要用tomcat这个容器,这样的话,spring并不能独立使用,必须依赖于tomcat。

    作者回复: 你从Github上看目录结构吧。或者你手工建web项目,然后把github上的代码copy过来。 狭义的Spring是不需要依赖Tomcat的,可以独立的。但是如果要web功能,就的要一个servlet服务器,Tomcat只是一种。

    2023-03-31归属地:北京
    4
  • 马儿
    课后习题:目前Dispatcher可以 访问到WebApplicationContext中的bean,Dispatcher中的bean目前也存在对象的属性中了,但是Dispatcher没有被WebApplicationContext引用所以不能被访问。请问老师spring在管理controller产生的bean的时候是将这些bean统一注册到WebApplicationContext吗?

    作者回复: 往后看。Spring里面是用了两层application context.

    2023-03-30归属地:四川
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部