目录
2、tomcat、Jetty、Undertow底层源码切换原理
当引入的包是tomcat的时候,就会创建一个TomcatEmbeddedServletContainerFactory
同理创建一个JettyEmbeddedServletContainerFactory
同理创建一个UndertowEmbeddedServletContainerFactory
一、配置嵌入式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容器