zoukankan      html  css  js  c++  java
  • 【串线篇】spring boot嵌入式Servlet容器启动原理;

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

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

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

    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容器

  • 相关阅读:
    Android之Handler用法总结
    关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题
    调整Eclipse代码字体大小
    android在进行创建项目gen下没有自动生成R.java
    Android Location在GPS中的应用(一)
    JSON 数据格式解析
    vim 插件管理
    linux开机自动启动
    crontab 定时任务
    shell note
  • 原文地址:https://www.cnblogs.com/yanl55555/p/12091833.html
Copyright © 2011-2022 走看看