十、SpringBoot——Servlet容器配置&相关原理(tomcat)

1 配置嵌入式Servlet容器

SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
下面是依赖关系图
在这里插入图片描述
修改和server有关的配置(ServerProperties);
server.port=8081
server.context‐path=/crud 设置项目访问路径
server.tomcat.uri‐encoding=UTF‐8
//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx

在这里插入图片描述

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

2、注册Servlet、Filter、Listener

由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
注册三大组件用以下方式
1 ) 注册 Servlet:ServletRegistrationBean

新建一个servlet 继承HttpServlet
在这里插入图片描述
新建一个配置类MyServerConfig,将MyServlet对象和请求路径封装到 ServletRegistrationBean并返回
在这里插入图片描述
对配置的路径进行测试
在这里插入图片描述

2)注册 Filter:FilterRegistrationBean

新建一个MyFilter类实现Filter接口
在这里插入图片描述
新建myFilter方法,对FilterRegistrationBean进行封装myFilter对象和需要过滤的uri
集合
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)Listener:ServletListenerRegistrationBean
新建myListener
在这里插入图片描述
封装MyListener对象到ServletListenerRegistrationBean并返回,启动、关闭应用进行测试可以看到控制台打印信息
在这里插入图片描述
在这里插入图片描述

SpringBoot帮我们自动SpringMVC的时候,自动的注册SpringMVC的前端控制器;DIspatcherServlet;dispatcherServletAutoConfiguration中:
在这里插入图片描述
3 其他的Servlet容器及切换

从继承关系,默认支持3种servlet容器
AbstractServletWebServerFactory
–TomcatServletWebServerFactory
–JettyServletWebServerFactory
–UndertowServletWebServerFactory

tomcat(默认使用)
jetty:(适合长连接,web聊天)
undertow(不支持jsp,高性能非阻塞高并发支持非常好)

a)Tomcat
在这里插入图片描述

b ) Jetty
新建springboot工程,exclusion把tomcat排除,引入jetty依赖,启动工程,日志可以看出jetty容器启动

在这里插入图片描述

c ) Undertow
新建springboot工程,exclusion把tomcat排除,引入jetty依赖,启动工程,日志可以看出jetty容器启动
在这里插入图片描述

4嵌入式Servlet容器自动配置原理
EmbeddedWebServerFactoryCustomizerAutoConfiguration:嵌入式的Servlet容器自动配置?
@ConditionalOnWebApplication判断是否为web项目

@ConditionalOnClass({Tomcat.class, UpgradeProtocol.class})判断是否引入tomcat依赖

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

以TomcatServletWebServerFactory为例

在这里插入图片描述
getWebServer方法:配置tomcat并返回出去,并启动
在这里插入图片描述

嵌入式容器的配置修改是的生效: ServerProperties定制器帮我们修改了Servlet容器的配置

容器配置的修改: WebServerFactoryCustomizerBeanPostProcessor
在这里插入图片描述
在这里插入图片描述

tomcat容器配置修改步骤总结:
1)、SpringBoot根据导入的依赖情况,给容器中添加相应的
EmbeddedWebServerFactoryCustomizerAutoConfiguration【TomcatWebServerFactoryCustomizer】
2)、容器中某个组件要创建对象就会惊动后置处理器;
WebServerFactoryCustomizerBeanPostProcessor;
只要是嵌入式的Servlet容器工厂,后置处理器就工作;
3)、后置处理器,从容器中获取所有的WebServerFactory,调用定制器的定制方法postProcessBeforeInitialization()—customize(webServerFactory)

5 嵌入式Servlet容器启动原理

获取嵌入式的Servlet容器工厂并启动步骤:

1)、SpringBoot应用启动运行run方法
2)、refreshContext(context);SpringBoot刷新IOC容器【创建IOC容器对象,并初始化容器,创建容器中的每一个组件】;如果是web应用创AnnotationConfigEmbeddedWebApplicationContext,否则:AnnotationConfigApplicationContext
3)、refresh(context);刷新刚才创建好的ioc容器;

在这里插入图片描述
在这里插入图片描述
4)、 onRefresh(); web的ioc容器重写了onRefresh方法
5)、web ioc容器会创建Servlet容器;createWebServer();
6)、获取Servlet容器工厂:
在这里插入图片描述
ServletWebServerFactory factory = this.getWebServerFactory();
从ioc容器中获取ServletWebServerFactory 组件;根据依赖配置获取TomcatServletWebServerFactory,后置处理器一看是这个对象,就获取所有的定制器来先定制Servlet容器的相关配置;
7)使用容器工厂获取Servlet容器:
this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});
8)Servlet容器创建对象并启动Servlet容器;先启动嵌入式的Servlet容器,再将ioc容器中剩下没有创建出的对象获取出来;IOC容器启动创建嵌入式的Servlet容器

6 使用外置的Servlet容器

1 ) 嵌入式Servlet容器
嵌入式Servlet容器:应用打成可执行的jar,不需要安装tomcat
优点:简单、便携;
缺点:默认不支持JSP、优化定制比较复杂(使用定制器ServerProperties修改配置

2 ) 外置的Servlet容器:外面安装Tomcat—应用war包的方式打包;
步骤
a)必须创建一个war项目;(利用idea创建好目录结构)
新建一个springboot工程,packing选择war。新建的war项目没有webapp目录,可以手动建一个(在main文件下新建一个webapp文件夹,在webapp下新建WEB-INF文件夹,在WEB-INF下新建web.xml文件)
在这里插入图片描述

b)将嵌入式的Tomcat指定为provided;

org.springframework.boot spring‐boot‐starter‐tomcat provided

c)必须编写一个SpringBootServletInitializer的子类,并调用configure方法

在这里插入图片描述
d)IDEA配置好外部servlet容器(tomcat…)启动服务器就可以使用;
war部署,可以打成war包放到服务器上,或者把服务器嵌入到IDEA上
在这里插入图片描述
在这里插入图片描述

7Servlet启动原理
1)jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;
2)war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;
servlet3.0(Spring注解版):

8.2.4 Shared libraries / runtimes pluggability:
规则:
1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:
2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名
3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

流程:
1)、启动Tomcat

2)org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar\METAINF\services\javax.servlet.ServletContainerInitializer:
Spring的web模块里面有这个文件org.springframework.web.SpringServletContainerInitializer

3)SpringServletContainerInitializer@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup方法的Set>;为这些WebApplicationInitializer类型的类创建实例;

4)、每一个WebApplicationInitializer都调用自己的onStartup;

4、使用其他Servlet容器
在这里插入图片描述
5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法

6)、SpringBootServletInitializer实例执行onStartup的时候会createRootApplicationContext;创建容器

在这里插入图片描述
7)、Spring的应用就启动并且创建IOC容器
在这里插入图片描述
在这里插入图片描述
启动Servlet容器,再启动SpringBoot应用

外部servlet容器启动总结
– Servlet3.0标准ServletContainerInitializer扫描所有jar包中META-
INF/services/javax.servlet.ServletContainerInitializer文件指定的类并加载
– 加载spring web包下的SpringServletContainerInitializer
– 扫描@HandleType(WebApplicationInitializer)
– 加载SpringBootServletInitializer并运行onStartup方法
– 加载@SpringBootApplication主类,启动容器等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值