spring boot容器启动

101 阅读3分钟

spring 容器启动

  1. spirng 上下文加载器实现了servlet规范的监听器,并将具体的方法在ContextLoader中实现,tomcat启动时会自动调用contextInitialized方法初始化spring上下文,在停止时会自动调用contextDestroyed销毁上下文。
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent event) {
       initWebApplicationContext(event.getServletContext());
    }
    @Override
    public void contextDestroyed(ServletContextEvent event) {
       closeWebApplicationContext(event.getServletContext());
       ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }

}
  1. 上下文初始化过程
  • 【1】搜集servlet初始化参数配置的applicationContextInitializer包含全局初始化参数容器globalInitializerClasses和初始化参数contextInitializerClasses容器
  • 【2】执行搜集到的所有并执行initialize方法,【这里有扩展点】customizeContext(sc, wac);
  • 【3】刷新上下文
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {
    > 1ContextLoader.determineContextInitializerClasses 
    > 2ApplicationContextInitializer.initialize
    > 3、刷新上下文
    wac.refresh();
}
  • 【1】对Environment中的servletContextInitParams和servletConfigInitParams的propertySource初始化。
  • 【2】校验了是否存在requiredProperties中包含的必须存在的属性,否则会抛出MissingRequiredPropertiesException,requiredProperties默认为空
  • 【3】初始化了事件监听器ApplicationListener和事件ApplicationEvent
> 1、M:initPropertySources
> 2、AbstractPropertyResolver:M:validateRequiredProperties
> 3、P:earlyApplicationEvents
prepareRefresh();
  • 【1】刷新beanFactory
  • 【1.1】销毁单例bean(清空了set容器)
  • 【1.2】关闭beanFactory(beanFactory=null)
  • 【1.3】为beanFactory设置allowBeanDefinitionOverriding、allowCircularReferences属性
  • 【1.4】创建beanfactory
  • 【1.5】搜集sacn(basePackages)\configLocaltion 方式指定的配置注册beanDefinition到beanfactory。exclude属性、@Conditional等在这里处理。
  • 【2】返回刷新完创建的beanFactory
> 1、M:refreshBeanFactory
> 1.1、M:destroyBeans
> 1.2、M:closeBeanFactory
> 1.3、M:customizeBeanFactory
> 1.4、M:createBeanFactory
> 1.5、M:loadBeanDefinitions(beanfactory)
> 2、M:getBeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  • 为bean工厂做准备,对bean工厂进行了配置。
  • 配置了ignoredDependencyInterfaces。在Spring注入的过程中,如果是ignoredDependencyInterfaces所包含的类型bean,会忽略注入。
  • 配置了resolvableDependencies,key依赖类型,value依赖bean。在Spring注入的过程中,如果注入的类型为resolvableDependencies对应的key,则注入resolvableDependencies所对应的value。默认内置的bean(BeanFactory、RescourceLoader、ApplicationEventPublisher、ApplicationContext)
  • 添加了一些后置处理器BeanPostProcessor,注册了一些单例bean。
  • 注册了与Environment相关的单例。默认内置的bean name为(environment的systemProperties、systemEnvironment)
prepareBeanFactory(beanFactory);
  • 注册后置处理器WebApplicationContextServletContextAwareProcessor,在bean初始化之前,对bean设置ServletContext和ServletConfig。忽略了ServletContextAware接口依赖。
  • registerWebApplicationScopes注册了request、session、application作用域。
  • 创建了ServletRequest、ServletResponse、HttpSession、WebRequest可依赖对象工厂。
postProcessBeanFactory(beanFactory);
  • 【1、】搜集并执行BeanDefinitionRegistryPostProcessor的方法【注意这里有扩展点】
  • 【2、】搜集并执行BeanFactoryPostProcessor的方法【注意这里有扩展点】
> 1、BeanDefinitionRegistryPostProcessor:M:postProcessBeanDefinitionRegistry(registry)
> 2、BeanFactoryPostProcessor:M:postProcessBeanFactory(beanFactory)
invokeBeanFactoryPostProcessors(beanFactory);
  • 这个方法是注册BeanPostProcessor。实际上就是把存放在DefaultListableBeanFactory#beanDefinitionMap中的bean的定义信息找出实现了BeanPostProcessors的Beandefinition进行实例化,保存到AbstractBeanFactory#beanPostProcessors。【注意这里有扩展点】
registerBeanPostProcessors(beanFactory);
  • 这里是对国际化的支持
initMessageSource();
  • 初始化事件分发器
initApplicationEventMulticaster();
  • 此方法创建了web容器,为了后续启动Servlet。通过加载的@ConditionalOnClass判断类是否加载,SpringBoot内置了Tomcat,注册了TomcatServletWebServerFactory。这里只是创建,并没有去启动tomcat。
onRefresh();
  • 注册事件监听器
registerListeners();
  • 实例化/初始化 单例bean 【这里有很多扩展点】
> 1、BeanFactory:M:preInstantiateSingletons()
finishBeanFactoryInitialization(beanFactory);
  • 【1、】启动tomcat容器
  • 【2、】发送容器启动事件
finishRefresh();

启动流程

spring 扩展点.png