spring 容器启动
- 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】搜集servlet初始化参数配置的applicationContextInitializer包含全局初始化参数容器globalInitializerClasses和初始化参数contextInitializerClasses容器
- 【2】执行搜集到的所有并执行initialize方法,【这里有扩展点】customizeContext(sc, wac);
- 【3】刷新上下文
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {
> 1、ContextLoader.determineContextInitializerClasses
> 2、ApplicationContextInitializer.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();
启动流程
