开发者学堂课程【SpringBoot快速掌握 - 核心技术:嵌入式 Servlet 容器启动原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9262
嵌入式 Servlet 容器启动原理
内容介绍
一、原理简介
二、实操演示
一、原理简介
什么时候创建嵌入式的 Servlet 容器工厂?什么时候获取嵌入式的Servlet 容器并启动 Tomcat ;获取嵌入式的 Servlet 容器工厂:
1 、SpringBoot 应用启动运行 run 方法
2 、refreshContext(context);SpringBoot
刷新 IOC 容器【创建 IOC 容器对象,并初始化容器,创建容器中的每一个组件】﹔
如果是 web 应用创建AnnotationConfigEmbeddedWebApplicationContext
,否则:
AnnotationConfigApplicationContext
3 )、refresh(context); 刷新刚才创建好的 ioc 容器;
部分代码如下:
catch (BeansException ex) {
if ( logger.iswarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.destroyBeans( );
// Reset 'active’ flag.cancelRefresh(ex);
// Propagate exception to caller.throw ex;
}
finally {
Reset common introspection caches in Spring 's core,since wel/ might not ever need metadata for singleton beans anymore. ..resetCommoncaches( );
}
catch (BeansException ex){
if (logger.isWarnEnabled()){
logger.warn("Exception encountered during context initialization -"+
"cancelling refresh attempt: "+ex);
}
// Destroy already created singletons to avoid dangling resources.destroyBeans();
//Reset 'active’ flag.cancelRefresh(ex);
//Propagate exception to caller.throw ex;
finally {
// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();
}}}
4 、onRefresh(); web 的 ioc 容器重写了 onRefresh 方法
5 、webioc 容器会创建嵌入式的 Servlet 容器; createEmbeddedServletContainer();
6、获取嵌入式的 Servlet 容器工厂:EmbeddedServletContainerFactorycontainerFactory=getEmbeddedServletContainerFactory();
从 ioc 容器中获取 EmbeddedServletContainerFactory
组件;
TomcatEmbeddedServletContainerFactory
创建对象,后置处理器一个是这个对象,就获取所有的定制器来先定利 Servlet 容器的相关配置;
7 、使用容器工厂获取嵌入式的 Servlet 容器:this.embeddedServletContainer = containerFactory.getEmbeddedServletContainer(getSelflnitializer());
8、嵌入式的 Servlet 容器创建对象并启动 Servlet 容器;
先启动嵌入式的 Servlet 容器,再将 ioc 容器中剩下没有创建出的对象获取出来; IOC 容器启动创建嵌入式的 Servlet 容辟
二、实操演示
MyServerConfig 部分代码展示:
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrattionBean registrationBean = new Servletreturn registrationBean;
}
//配置嵌入式的 servlet 容器 @Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
//r定制嵌入式的 Servlct 容器相关的规则
@Override
public void customize(ConfigurableEmbeddedServletContainer container);
}
}