首页 > 编程语言 > 详细

【串线篇】spring boot嵌入式Servlet容器启动原理;

时间:2019-12-24 16:23:02      阅读:108      评论:0      收藏:0      [点我收藏+]

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

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

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

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

public  void  refresh()  throws  BeansException,  IllegalStateException  {
synchronized  (this.startupShutdownMonitor)  {
// Prepare this context for refreshing. 
prepareRefresh();

// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory  beanFactory  =  obtainFreshBeanFactory();

// Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory);

try {
//  Allows  post‐processing  of  the  bean  factory  in  context  subclasses.

postProcessBeanFactory(beanFactory);

// Invoke factory processors registered as beans in the context. 

invokeBeanFactoryPostProcessors(beanFactory);

//  Register  bean  processors  that  intercept  bean  creation. 

registerBeanPostProcessors(beanFactory);

//  Initialize  message  source  for  this  context. 

initMessageSource();

//  Initialize  event  multicaster  for  this  context. 

initApplicationEventMulticaster();

// Initialize other special beans in specific context subclasses. 

onRefresh();

//  Check  for  listener  beans  and  register  them. 

registerListeners();

//  Instantiate  all  remaining  (non‐lazy‐init)  singletons. 

finishBeanFactoryInitialization(beanFactory);

// Last step: publish corresponding event.

 finishRefresh();
 
    }
 
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容器工厂:

EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();

从ioc容器中获取EmbeddedServletContainerFactory 组件;TomcatEmbeddedServletContainerFactory创建对象,后置处理器一看是这个对象,就获取所有的定制器来先定制Servlet容器的相关配置;

7)、使用容器工厂获取嵌入式的Servlet容器:this.embeddedServletContainer = containerFactory

.getEmbeddedServletContainer(getSelfInitializer());

8)、嵌入式的Servlet容器创建对象并启动Servlet容器;

先启动嵌入式的Servlet容器,再将ioc容器中剩下没有创建出的对象获取出来;

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

【串线篇】spring boot嵌入式Servlet容器启动原理;

原文:https://www.cnblogs.com/yanl55555/p/12091833.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!