Spring Boot注册servlet三大组件

更多信息:

本篇算是学习笔记

视频
尚硅谷
配置文件的信息
Spring Boot文档

编辑器:IntelliJ IDEA 2020.1



原因

我们Spring Boot应用默认以jar包的方式启动嵌入式Tomcat,而不是创建标准的web目录结构webapp/WEB-INF/web.xml,然后我们把三大组件(Servlet、Filter、Listner)注册在web.xml中


三大组件的创建

Servlet的创建

在这里插入图片描述

ServletRegistrationBean

在这里插入图片描述

MyServerConfig

在这里插入图片描述

Filter的创建

在这里插入图片描述

FilterRegistrationBean

在这里插入图片描述

MyServerConfig

在这里插入图片描述

Listener的创建

在这里插入图片描述

ListenerRegistrationBean

在这里插入图片描述

MyServerConfig

在这里插入图片描述

总结

我们的MyServerConfig中对应的组件方法中,我们可以设置我们需要的功能
三种容器的注册方法大同小异。


例子

SpringBoot帮我们自动SpringMVC的时候,自动的注册SpringMVC的前端控制器;DIspatcherServlet;

@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(
      DispatcherServlet dispatcherServlet) {
   ServletRegistrationBean registration = new ServletRegistrationBean(
         dispatcherServlet, this.serverProperties.getServletMapping());
    //默认拦截: /  所有请求;包静态资源,但是不拦截jsp请求;   /*会拦截jsp
    //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
    
   registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
   registration.setLoadOnStartup(
         this.webMvcProperties.getServlet().getLoadOnStartup());
   if (this.multipartConfig != null) {
      registration.setMultipartConfig(this.multipartConfig);
   }
   return registration;
}


使用其他嵌入式Servlet容器

例如:jetty(长连接,适用于聊天)、Undertow(不支持JSP)
EmbeddedServletContainerCustomizer
在这里插入图片描述
我们选中ConfigurableEmbeddedServletContainer,ctrl+H唤起继承树,我们就可以看到其他可以替换的嵌入式Servlet容器

我们先排除Tomcat
在这里插入图片描述
然后在pom.xml导入Servlet容器

<dependency>
            <artifactId>spring-boot-starter-undertow</artifactId>
            <groupId>org.springframework.boot</groupId>
</dependency>

嵌入式Servlet容器自动配置原理

管理Servlet容器自动配置的自动配置类
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

例子

TomcatWebServerFactoryCustomizer
在这里插入图片描述
customize方法来给Servlet容器进行属性赋值

步骤:
1)、SpringBoot根据导入的依赖情况,给容器中添加相应的WebServerFactoryCustomizer【TomcatWebServerFactoryCustomizer】

2)、容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;

只要是嵌入式的Servlet容器工厂,后置处理器就工作;

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


嵌入式Servlet容器启动

什么时候创建嵌入式的Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat;

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

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

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

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容器中剩下没有创建出的对象获取出来;

IOC容器启动创建嵌入式的Servlet容器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值