SpringBoot成神之路--13.配置嵌入式servlet及注册servlet、filter、listener及使用其他的servlet容器及底层实现

目录

 

一、配置嵌入式servlet

 1、嵌入式servlet问题

如何定制和修改servlet容器的相关配置

 总结:

2、注册servlet、filter、listener

servlet处理

过滤器处理

 监听器处理

二、使用其他的servlet容器

1、tomcat、Jetty、Undertow

 2、tomcat、Jetty、Undertow底层源码切换原理

当引入的包是tomcat的时候,就会创建一个TomcatEmbeddedServletContainerFactory

 同理创建一个JettyEmbeddedServletContainerFactory

 同理创建一个UndertowEmbeddedServletContainerFactory

 tomcat为例分析

3、servlet容器启动步骤 

三、嵌入式servlet容器启动原理

四、jar包和war包原理


一、配置嵌入式servlet

在传统的方式,我们需要将web项目打包成一个war包,然后通过外部的tomcat(一个servlet容器)来进行启动

而springboot是不需要外部的tomcat来启动的

查看xml依赖类图

 1、嵌入式servlet问题

1)、如何定制和修改servlet容器的相关配置(传统的方式我们是在tomcat的conf文件夹下修改它的配置文件);

2)、springboot能不能支持其他的servlet容器;

 

如何定制和修改servlet容器的相关配置

(传统的方式我们是在tomcat的conf文件夹下修改它的配置文件)

在springboot中,在serverproperties中的属性都是可配置属性

 

 

 

 上面是通过properties文件进行修改,我们也可以通过EmbeddedServletContainerCustomizer:嵌入式的servlet容器的定制器;来修改servlet容器的配置

 

其实这两种方式的底层实现是一样的,两种方式都是实现的EmbeddedServletContainerCustomizer接口(第一种方式是使用springboot提供好的容器,另外一种是自己重新写一个容器)

 

 总结:

在springboot中会有非常多的xxxconfigurer帮助我们进行扩展配置

在springboot中会有很多的xxxcustomizer帮助我们进行定制配置

2、注册servlet、filter、listener

ServletRegistrationBean

FilterRegistrationBean

ServletListenerRegistrationBean

 

servlet处理

创建MyServlet继承HttpServlet类,来处理get和post请求

 接下里我们需要将该类注册进容器中

 

 其他的注册方式也是同样的

过滤器处理

 

 监听器处理

 

 在springboot中配置了servlet拦截请求

 默认拦截请求

 默认拦截:"/"所有请求,包括静态资源,但是不拦截jsp请求;  "/*"会拦截jsp

可以通过server.servletPath来修改springmvc前端控制器默认拦截的请求路径

 

二、使用其他的servlet容器

1、tomcat、Jetty、Undertow

tomcat(web网站系统开发)、Jetty(长连接,比如聊天会话)、Undertow(不支持jsp,非阻塞的,并发性好)

查看抽象类configurableembeddedservletcontainer它的实现类

springboot支持三个应用服务器(servlet容器):tomcat、undertow、jetty

 为什么springboot默认使用的是tomcat?

打开springboot依赖类图

 导入其他的应用服务器jetty(首先得排除掉tomcat嵌入式jar包)

 启动

 2、tomcat、Jetty、Undertow底层源码切换原理

在springboot中管理servlet容器的类

 判断是否引入了servlet和tomcat类以及是否存在该组件

 查看EmbeddedServletContainerFactory的继承实现

以及他们所对应的能够创建的容器

 它们又是怎么自动配置的呢

当引入的包是tomcat的时候,就会创建一个TomcatEmbeddedServletContainerFactory

 同理创建一个JettyEmbeddedServletContainerFactory

 同理创建一个UndertowEmbeddedServletContainerFactory

 tomcat为例分析

 tomcat服务器启动是在gettomcatembeddedservletcontainer方法中调用的

 分析BeanPostProcessorsRegistrar

 

 

 

从容器中获取所有这个类型的组件:EmbeddedServletContainerCustomizer

 

总结:定制servlet容器,给容器中可以添加一个EmbeddedServletContainerCustomizer类型的组件

3、servlet容器启动步骤 

1)、springboot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory(例如TomcatEmbeddedServletContainerFactory)

2)、容器中某个组件要创建对象就会惊动后置处理器,EmbeddedServletContainerCustomizerBeanPostProcessor,只要是嵌入式的servlet容器工厂,后置处理器就会工作;

3)、后置处理器,从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法

 

三、嵌入式servlet容器启动原理

创建工厂

获取嵌入式容器

 

 获取嵌入式的servlet容器工厂

1)、springboot应用启动运行run方法

2)、refreshcontext(context);springboot刷新IOC容器(创建IOC容器对象,并初始化容器,创建容器中的每一个组件);如果是web应用创建AnnotationConfigEmbeddedWebApplicationContext,否则创建AnnotationConfigApplicationContext

3)、refresh(context);刷新刚才创建的容器

4)、onRefresh();web的ioc容器重写了onRefresh方法

5)、webioc容器会创建嵌入式的servlet容器。CreateEmbeddedServletContainer方法

6)、获取嵌入式的servlet容器工厂,

EmbeddedServletContainerFactory  containerfactory=getEmbeddedServletContainerFactory();

从ioc容器中获取EmbeddedServletContainerFactory组件,tomcatembeddedservletcontainerfactory创建对象,后置处理器判断如果是这个对象,就获取所有的定制器来定制servlet容器的相关配置。

7)、使用容器工厂获取嵌入式的servlet容器:this.embeddedServletContainer=containerFactory.getEmbeddedServletContainer(getSelfInitializer());

8)、嵌入式的servlet容器创建对象并启动servlet容器;

先启动嵌入式的servlet容器,再将ioc容器中剩下没有创建出的对象获取出来。

四、jar包和war包原理

jar包:执行springboot主类的main方法,启动ioc容器,创建嵌入式的servlet容器

war包:启动服务器,服务器启动springboot应用,启动ioc容器

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值