Spring Web启动调用过程
ContextLoaderListener:ContextLoader:ServletContextListener#contextInitialized()
↓
initWebApplicationContext()
↓
configureAndRefreshWebApplicationContext()
↓
customizeContext() ## 执行ApplicationContextInitializer#initialize()
↓
ConfigurableWebApplicationContext#refresh()
在没有使用spring boot之前,一般常是使用tomcat做为外部容器启动java web应用,sping 在支持java web应用时,也遵循j2ee的标准。
在spring web中,spring 的启动入口是org.springframework.web.context.ContextLoaderListener,该类实现了javax.servlet.ServletContextListener接口,在web容器上下文初始化之后,将会调用ContextLoaderListener#contextInitialized(ServletContextEvent)方法,在该方法中,会执行org.springframework.web.context.ContextLoader#initWebApplicationContext(ServletContext)方法,调用ApplicationContext#refresh()。
Spring ApplicationContext 加载过程
AbstractApplicationContext#refresh()
↓
prepareRefresh() ## 处理refersh前的准备工作
↓
obtainFreshBeanFactory() ## 创建BeanFactory,扫描注册BeanDefinition
↓
prepareBeanFactory() ## 处理BeanFactory的准备内容,初始化赋值
↓
postProcessBeanFactory()
↓
invokeBeanFactoryPostProcessors() ## 执行在context注册的BeanFactoryProcessor
↓
registerBeanPostProcessors() ## 注册BeanProcessor
↓
initMessageSource()
↓
initApplicationEventMulticaster() ## 初始化ApplicationEventMulticaster
↓
onRefresh() ## 初始化一些特殊的Bean, 例如Servlet或Reactive的WebServer
↓
registerListeners() ## 注册ApplicationListener
↓
finishBeanFactoryInitialization() ## 实例化剩余(除懒加载(@Lazy)外的)的单例Bean
↓
finishRefresh() ## 执行LifecycleProcessor的onRefresh方法,发送ContextRefreshedEvent