Spring IOC过程
https://www.processon.com/diagraming/5c96171fe4b0f88919b98497
1. AbstractApplicationContext:执行refresh()方法;让子类实现obtainFreshBeanFactory()方法;
2. 子类AbstractRefreshableApplicationContext实现refreshBeanFactory()方法
创建IOC容器(DefaultListableBeanFactory);
委派子类实现loadBeanDefinitions()方法;
3. AbstractXmlApplicationContext:执行loadBeanDefinition()
创建XmlBeanDefinitionReader(Bean容器读取器,容器使用该读取器读取Bean定义资源);
loadBeanDefinitions(beanDefinitionReader);
setConFigLocations();获取配置文件路径;
reader.loadBeanDefinitions(configLocations):Bean容器读取器读取定位Bean定义资源.
4. AbstractBeanDefinitionReader:执行loadBeanDefinitions
getResourceLoader():获取IOC容器初始化过程中设置的资源加载器
Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);将指定位置的 Bean 定义资源文件解析为 Spring IOC 容器封装的资源
int count = loadBeanDefinitions(resources); 委派调用其子类 XmlBeanDefinitionReader 的方法,实现加载功能
5. XmlBeanDefinitionReader:执行doLoadBeanDefinitions()
doLoadDocument:将XML文件转换为DOM对象;
registerBeanDefinitions:解析Bean的详细过程;
创建BeanDefinitionDocumentReader:用来对xml格式的BeanDefinition解析;
DocumentReader.registerBeanDefinitions:具体的解析实现过程由DefaultBeanDefinitionDocumentReader来实现。
6. DefaultBeanDefinitionDocumentReader:执行registerBeanDefinitions
创建BeanDefinitionParserDelegate对象用来真正执行解析Bean的工作
preProcessXml:解析Bean定义之前,进行自定义解析
parseBeanDefinitons()
parseDefaultElement:使用Spring的Bean规则解析元素节点
解析<Import>元素
解析<Alias>元素
解析<Bean>元素
获取BeanDefinitionHolder(BeanDefinitionHolder 是对 BeanDefinition 的封装,即Bean定义的封装类)
BeanDefinitionParserDelegate.parseBeanDefinitionElement
parseBeanDefinitionElement:详细对<Bean>元素中配置的 Bean 定义进行解析的地方
BeanDefinitionReaderUtils.registerBeanDefinition:向Spring IOC容器注册解析得到的Bean定义,这是Bean定义向IOC容器注册的入口
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()):向 IOC 容器注册 BeanDefinition
解析嵌套Bean元素
postProcessXml:解析Bean定义之后,进行自定义解析