springBoot(六)--实现SpringMVC

了解了SpringBoot中Tomcat的启动过程,本文来看一下SpringBoot中如何向Tomcat中添加Servlet、Filter、Listener.

自定义Servlet、Filter、Listener

Spring容器中声明ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean
在这里插入图片描述

@ServletComponentScan注解和@WebServlet、@WebFilter以及@WebListener注解的配合使用

@ServletComponentScan注解启用ImportServletComponentScanRegistrar类,是个ImportBeanDefinitionRegistrar接口的实现类,会被Spring容器所解析。ServletComponentScanRegistrar内部会解析@ServletComponentScan注解,然后会在Spring容器中注册ServletComponentRegisteringPostProcessor,是个BeanFactoryPostProcessor,会去解析扫描出来的类是不是有@WebServlet、@WebListener、@WebFilter这3种注解,有的话把这3种类型的类转换成ServletRegistrationBean、FilterRegistrationBean或者ServletListenerRegistrationBean,然后让Spring容器去解析
在这里插入图片描述

在Spring容器中声明Servlet、Filter或者Listener

在这里插入图片描述
相比SpringMVC中通过在web.xml中配置DispatcherServlet来说,SpringBoot中配置Servlet很简单,但是底层却不简单。

ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean三个类

ServletRegistrationBean

在这里插入图片描述
在这里插入图片描述

FilterRegistrationBean

在这里插入图片描述
在这里插入图片描述

ServletListenerRegistrationBean

在这里插入图片描述

RegistrationBean

在这里插入图片描述
ServletContextInitializer是 Servlet 容器初始化的时候,提供的初始化接口。所以,Servlet 容器初始化会获取并触发所有的ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean实例中onStartup方法。
触发这些类的onStartup方法的方式:
在这里插入图片描述
接下来看一下FilterRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean实例是何时加入到Initializers集合中的。

Servlet容器的启动

EmbeddedWebApplicationContext中获取嵌入式的Servlet容器工厂,并通过工厂来获取Servlet容器的时候,会先通过getSelfInitializer()获取到所有的Initializer,传入Servlet容器中,看一下getSelfInitializer()方法:
在这里插入图片描述
Servlet容器启动的时候,会调用这个ServletContextInitializer对象的onStartup方法,onStartup中的逻辑也就是selfInitialize方法,并将Servlet上下文对象传进去了。
selfInitialize
在这里插入图片描述

先获取所有的ServletContextInitializer实现类,然后遍历执行所有ServletContextInitializer的onStartup方法。

获取所有的ServletContextInitializer

首先来看一下getServletContextInitializerBeans
方法:
在这里插入图片描述
ServletContextInitializerBeans对象是对ServletContextInitializer的一种包装:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第8行调用addServletContextInitializerBeans方法:
在这里插入图片描述
调用addServletContextInitializerBean方法:
在这里插入图片描述
在这里插入图片描述
构造器中的另外一个方法:addAdaptableBeans(beanFactory)

在这里插入图片描述
两个适配器:
在这里插入图片描述
Servlet.class、Filter.class都添加到List<ServletContextInitializer> sortedList这个集合中去了,接着就是遍历这个集合,执行其onStartup方法。
在这里插入图片描述

ServletContextInitializer的onStartup方法

ServletRegisterationBean
在这里插入图片描述
在这里插入图片描述
AbstractFilterRegistrationBean
在这里插入图片描述

DispatcherServletAutoConfiguration

SpringBoot在自动配置SpringMVC的时候,会自动注册SpringMVC前端控制器:DispatcherServlet,该控制器主要在DispatcherServletAutoConfiguration自动配置类中进行注册,DispatcherServlet是SpringMVC中的核心分发器,DispatcherServletAutoConfiguration也在spring.factories中配置了。
在这里插入图片描述
DispatcherServletConfiguration
在这里插入图片描述
在这里插入图片描述
ServletRegistrationBean的逻辑为:在Tomcat启动的时候,会获取所有的ServletRegistrationBean,并执行其中的onstartup方法,将DispatcherServlet注册到Servlet容器中,这样就类似原来的web.xml中配置的dispatcherServlet。所以只要导入了spring-boot-starter-web这个starter,SpringBoot就有了Tomcat容器,并且往Tomcat容器中注册了DispatcherSevlet对象,这样就能接收我们的请求了。
感谢并参考:
https://www.cnblogs.com/java-chen-hao/p/11842611.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值