一、组件:
beanDefinitionMap要创建的类名和类描述集合,beanDefinitionNames要创建的类名集合。
二、整体描述:
启动一个WEB项目的时候, WEB容器会去读取它的配置文件web.xml,web.xml中有一个监听器读取web.xml中配置的xml文件解析xml文件中的组件放入到beanDefinitionMap和beanDefinitionNames中,然后变量beanDefinitionNames去创建类。
三、解析xml流程
ContextLoaderListener,实现了web容器接口ServletContextListener,ServletContextListener监听到web容器启动时,加载本类的contextInitialized方法。
当ContextLoader初始化时,执行静态方法获取ContextLoader.properties配置文件,赋值给全局变量defaultStrategies。
ContextLoader.properties内容如下。
看ContextLoaderListener继承关系
父类ContextLoader
ContextLoaderListener实现了contextInitializedinit执行父类initWebApplicationContext
->this.context = createWebApplicationContext(servletContext);
->determineContextClass读取defaultStrategies中key值为org.springframework.web.context.WebApplicationContext的值
org.springframework.web.context.support.XmlWebApplicationContext最后创建出来XmlWebApplicationContex对象后返回。
查看XmlWebApplicationContext继承关系
父类AbstractRefreshableWebApplicationContext
父类AbstractRefreshableConfigApplicationContext
父类AbstractRefreshableApplicationContext
父类AbstractApplicationContext
实现ConfigurableWebApplicationContext
父类WebApplicationContext
如图进入if判断中,强转XmlWebApplicationContext对象为ConfigurableWebApplicationContext类型。继续执行
configureAndRefreshWebApplicationContext
读取web.xml中key为contextConfigLocation的值放入到spring容器中。
继续执行wac.refresh();wac就是传入的XmlWebApplicationContext对象。执行AbstractApplicationContext(XmlWebApplicationContext的父类)中refresh。
执行obtainFreshBeanFactory
->refreshBeanFactory(AbstractRefreshableApplicationContext中,XmlWebApplicationContext的父类)
->loadBeanDefinitions(XmlWebApplicationContext)
循环遍历web.xml中配置的xml文件路径。
执行loadBeanDefinitions(AbstractBeanDefinitionReader)
执行到loadBeanDefinitions(XmlWebApplicationContext)
读取xml后把xml中bean注册到BeanDefinition(类的描述类)中
执行
执行DefaultBeanDefinitionDocumentReader中processBeanDefinition
执行
执行BeanDefinitionReaderUtils中registerBeanDefinition
每注册一个组件beanDefinitionNames(List)添加组件名称,beanDefinitionMap(Map)放入组件名key,和组件描述value。这两个会在创建组件的时候使用。
四、创建bean的流程
继续执行AbstractApplicationContext中refresh中finishBeanFactoryInitialization方法进行bean创建。
->beanFactory.preInstantiateSingletons();
遍历beanDefinitionNames中的bean
->getBean(DefaultListableBeanFactory)
->doGetBean(DefaultListableBeanFactory)
->createBean(AbstractBeanFactory)
->createBean(AbstractAutowireCapableBeanFactory)