更多信息:
本篇算是学习笔记
编辑器: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容器