spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动

这篇具有很好参考价值的文章主要介绍了spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spring-framework 版本:v5.3.19

整合步骤

试想这么一个场景。只用 spring mvc(确切来说是spring-framework), 如何既不搭建web工程(无web.xml)又不用 spring boot 的去整合tomcat部署一个web服务?

1、引入 tomcat 和 spring mvc

   		......
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>9.0.62</version>
        </dependency>
    	
    	......

2、实现 WebApplicationInitializer接口,即本篇实现的spring mvc 提供的 AbstractAnnotationConfigDispatcherServletInitializer 类
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
3、编写controller类
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
4、编写main函数启动 tomcat
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
验证:
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

整个项目目录如下
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

案例 github 地址:https://github.com/no-shutdown/springmvcandjsp.git

实现原理

ServletContainerInitializer与WebApplicationInitializer

ServletContainerInitializer是Java Servlet 3.0规范中的一部分,接口定义了一个onStartup方法,容器(例如Tomcat、Jetty等)在启动Web应用程序时会调用这个方法。

至于容器如tomcat里的代码是如何得到用户自定义的接口实现类的?
答:通过SPI的方式去获取。

SpringServletContainerInitializer
spring中为我们实现的ServletContainerInitializer实现类如下
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

@HandlesTypes 是Java Servlet 3.0规范中ServletContainerInitializer接口的一个特性,用于向ServletContainerInitializer提供在类路径上发现的类的信息。比如:这里的意思就是说,会收集路径上所有的 WebApplicationInitializer 类作为方法参数传入。

所以也就是说,在本篇的案例中,main函数启动tomcat时,tomcat会通过SPI的方式去调用到 SpringServletContainerInitializer 类的onStartup方法,而 SpringServletContainerInitializer 又会通过 @HandlesTypes 获取到所有 WebApplicationInitializer 类并调用他们的 onStartup 方法。

所以其实并不一定要继承 AbstractAnnotationConfigDispatcherServletInitializer ,也可以自己去实现一个 WebApplicationInitializer 接口,总之需要在 WebApplicationInitializer#onStratUp 中去启动父子容器。

AbstractAnnotationConfigDispatcherServletInitializer
AbstractAnnotationConfigDispatcherServletInitializer 就是 spring mvc 为我们提供的 WebApplicationInitializer 接口抽象类中的其中一个。其 onStartup 方法做了一些启动父子容器相关的操作。
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

父容器的启动

registerContextLoaderListener
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
这个方法做了两件事
1:创建一个spring容器
2:注册 ContextLoaderListener 到servlet容器

创建父容器的代码上图中一起给了,这里再看下 ContextLoaderListener 。
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
这是一个 ServletContextListener 监听类,在servlet容器启动时,会调用当前servlet容器所注册监听器的 contextInitialized 方法。

父容器就是在 ContextLoaderListener.contextInitialized 中启动的,如下
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

子容器的启动

registerDispatcherServlet
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
这个方法做了两件事
1:创建一个spring容器
2:注册 DispatcherServlet 到servlet容器

创建子容器的代码上图中一起给了,这里再看下 DispatcherServlet 。
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc
这个类并不陌生,就是 spring mvc 的前端控制器。
但从servlet容器的角度来看,就是一个普通的HttpServlet,所以必然遵循servlet生命周期。
这个servlet生命周期的 init 方法就会去启动子容器。
spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动,Spring,spring,mvc

相关面试题

1、spring和spring mvc为什么要设计父子容器?
答:单一职责原则,早期spring mvc并不是唯一的主流web框架。为方便快速拔插,比如从 spring mvc 切换到 struts,使用父子容器只需将spring­mvc.xml替换成struts的配置文件struts.xml即可,而spring­core.xml不需要改变。

2、是否可以把所有Bean都交给spring容器(父容器)来管理?
答:不可以,会出现404。因为 spring mvc 在启动时只会扫描当前容器下Controller注册HandlerMethod,并没有同时去查找父容器的bean。

3、是否可以把所有bean都交给spring mvc容器(子容器)来管理?
答:可以 , 因为父容器无非就是包含一些子容器不包含的bean, 如果全在子容器就完全不用父容器了。不过需要注意的是,如果bean都注册到子容器,原本在父容器配置事务、aop等也需要移动到子容器,否则是不会生效的。文章来源地址https://www.toymoban.com/news/detail-616818.html

到了这里,关于spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring ico容器 spring注入方式 spring与tomcat整合

    目录 一、简介 1、什么是spring? 2、目的 3、功能及使用范围 二、spring IOC 1、ioc的理解 2、开发人员可达到的目的 3、分析实现 4、bean配置 三、spring IOC的注入方式 1、set方法属性注入 2、构造注入 3、自动装配 四、spring与tomcat的整合/spring与web容器的整合 五、spring AOP 1、aop的特

    2024年02月12日
    浏览(46)
  • 73.是否可以把我们所需的Bean都放入Spring­mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)?

    可以 , 因为父容器的体现无非是为了获取子容器不包含的bean, 如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器来管理的。 虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也

    2024年02月21日
    浏览(47)
  • Spring5学习随笔-Spring5的第一个程序(环境搭建、日志框架整合)

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 1.JDK1.8+ 2.Maven3.5+ 3.IDEA2018+ 4.SpringFramework 5.1.4 官网:www.spring.io Spring的jar包 1.设置pom的依赖 Spring的配置文件 1.配置文件的放置位置:任意位置

    2024年02月05日
    浏览(44)
  • Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 Spring在3.x提供的新的注解,用于替换XML配置文件。 问题 : 配置Bean在应用的过程中替换了XML具体的什么内容? AnnotationConfigApplicationContext 配

    2024年02月05日
    浏览(46)
  • Spring5学习随笔-整合MyBatis(持久层)、连接池、Mapper文件

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 JavaEE开发需要持久层进行数据库的访问操作。 JDBC MyBatis、Hibernate进行持久开发过程存在大量的代码冗余 Spring基于模板设计模式对与上述的持

    2024年02月05日
    浏览(51)
  • Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)

    开篇: 欢迎来到 Spring 5 学习系列!在这个系列中,我们将深入研究 Spring 框架的最新版本,揭示其在现代Java开发中的精髓。无论你是初学者还是有经验的开发者,本系列都旨在为你提供深刻的理解和实用的知识,让你在构建强大、可维护和高效的应用程序方面更上一层楼。

    2024年01月22日
    浏览(78)
  • SpringMVC父子容器源码分析

    书接上文 1. Spring整合SpringMVC案例分析 Spring框架和Spring MVC框架是Java开发中常用的两个框架,它们可以很好地结合使用,提供了一个强大而灵活的开发环境。下面是一个简单的案例分析,演示如何整合Spring和Spring MVC。 主配置类 SpringMVC控制器 启动类,初始化Spring容器 web.xml o

    2024年01月19日
    浏览(39)
  • Spring MVC 二 :基于xml配置

    创建一个基于xml配置的Spring MVC项目。 Idea创建新项目,pom文件引入依赖: 在项目的webapp/WEB-INF目录下创建web.xml文件,配置DispatcherServlet: 注意其中定义了contextConfigLocation:上下文配置文件位置,配置为:classpath:springmvc.xml,指定Spring MVC启动过程中会到指定位置读取该配置文件

    2024年02月11日
    浏览(36)
  • 1.7 基于XML配置方式使用Spring MVC

    1、创建Maven项目 Maven项目 - SpringMvcDemo01 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加支持Spring MVC的相关依赖 3、给项目添加Web功能 打开项目结构窗口,在列表里选择【Modules】 单击【+】按钮,添加Web功能 单击【Create Artifact】按钮,将名称改为“SpringMvcDemo01” 单击

    2024年02月08日
    浏览(53)
  • 案例13 Spring MVC参数传递案例

    基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 选择Maven快速构建web项目,项目名称为case13-springmvc02。 ​ src.main路径下,执行new – Directory操作,选择java、resources后,执行回车键。 ​ 在web.xml中配置DispatcherServlet。 src.main.java.

    2024年02月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包