一、组件:

beanDefinitionMap要创建的类名和类描述集合,beanDefinitionNames要创建的类名集合。

二、整体描述:

启动一个WEB项目的时候, WEB容器会去读取它的配置文件web.xml,web.xml中有一个监听器读取web.xml中配置的xml文件解析xml文件中的组件放入到beanDefinitionMap和beanDefinitionNames中,然后变量beanDefinitionNames去创建类。

三、解析xml流程

ContextLoaderListener,实现了web容器接口ServletContextListener,ServletContextListener监听到web容器启动时,加载本类的contextInitialized方法。
spring容器初始化过程
当ContextLoader初始化时,执行静态方法获取ContextLoader.properties配置文件,赋值给全局变量defaultStrategies。
spring容器初始化过程
ContextLoader.properties内容如下。
spring容器初始化过程
看ContextLoaderListener继承关系
父类ContextLoader
ContextLoaderListener实现了contextInitializedinit执行父类initWebApplicationContext
->this.context = createWebApplicationContext(servletContext);
->determineContextClass读取defaultStrategies中key值为org.springframework.web.context.WebApplicationContext的值
org.springframework.web.context.support.XmlWebApplicationContext最后创建出来XmlWebApplicationContex对象后返回。
spring容器初始化过程
查看XmlWebApplicationContext继承关系
父类AbstractRefreshableWebApplicationContext
父类AbstractRefreshableConfigApplicationContext
父类AbstractRefreshableApplicationContext
父类AbstractApplicationContext
实现ConfigurableWebApplicationContext
父类WebApplicationContext
如图进入if判断中,强转XmlWebApplicationContext对象为ConfigurableWebApplicationContext类型。继续执行
configureAndRefreshWebApplicationContextspring容器初始化过程

读取web.xml中key为contextConfigLocation的值放入到spring容器中。
spring容器初始化过程
spring容器初始化过程
继续执行wac.refresh();wac就是传入的XmlWebApplicationContext对象。执行AbstractApplicationContext(XmlWebApplicationContext的父类)中refresh。
spring容器初始化过程
执行obtainFreshBeanFactory
->refreshBeanFactory(AbstractRefreshableApplicationContext中,XmlWebApplicationContext的父类)
->loadBeanDefinitions(XmlWebApplicationContext)
循环遍历web.xml中配置的xml文件路径。
执行loadBeanDefinitions(AbstractBeanDefinitionReader)
spring容器初始化过程
spring容器初始化过程
执行到loadBeanDefinitions(XmlWebApplicationContext)
读取xml后把xml中bean注册到BeanDefinition(类的描述类)中
spring容器初始化过程
执行spring容器初始化过程
执行DefaultBeanDefinitionDocumentReader中processBeanDefinitionspring容器初始化过程
执行spring容器初始化过程
执行BeanDefinitionReaderUtils中registerBeanDefinitionspring容器初始化过程
每注册一个组件beanDefinitionNames(List)添加组件名称,beanDefinitionMap(Map)放入组件名key,和组件描述value。这两个会在创建组件的时候使用。
spring容器初始化过程

四、创建bean的流程

继续执行AbstractApplicationContext中refresh中finishBeanFactoryInitialization方法进行bean创建。
->beanFactory.preInstantiateSingletons();
遍历beanDefinitionNames中的bean
spring容器初始化过程
->getBean(DefaultListableBeanFactory)
->doGetBean(DefaultListableBeanFactory)
->createBean(AbstractBeanFactory)
->createBean(AbstractAutowireCapableBeanFactory)

相关文章: