02. Spring IoC源码剖析流程
2021-04-11 17:58:03 0 举报
针对Spring5.x源码,剖析IoC初始化完成流程,附上解析的代码注释。
作者其他创作
大纲/内容
DefaultListableBeanFactory
AbstractApplicationContext
AbstractXmlApplicationContext
// 为Bean读取器设置Spring资源加载器
// 构造器创建资源加载器PathMatchingResourcePatternResolver
解析配置获取BeanDefinition
// 向Spring IoC容器中注册别名#registerAlias
#processBeanDefinition
// 解析Doc文档对象,获取Bean定义并缓存#registerBeanDefinitions
// 构造器ClassPathXmlApplicationContext(String)
Spring IoC初始化完成。
AbstractBeanDefinitionReader
// 设置父上下文,主要是获取父上下文的配置信息。setParent(parent);
// 解<import>标签元素#importBeanDefinitionResource
// 加载、解析XML配置#doLoadBeanDefinitions
// 销毁已经存在的FactoryBean容器:IoC容器的初始化可以认为是一次重启,需要将之前已经存在的容器完全销毁后,重新根据配置加载容器。
读取Spring配置资源
// 将资源文件转换为I/O流,并解析得到XML输入资源
// 将XML配置资源转换为内存DOM对象#doLoadDocument
// IoC容器初始化核心处理,包含配置定位、加载、解析和注册#obtainFreshBeanFactory()
// 初始化Bean资源加载器,主要是启用xml校验机制。
// 解析Spring的Bean配置文件资源#builder.parse(inputSource)
// 创建文档解析工厂类#createDocumentBuilderFactory
解析的Bean定义注册到IoC容器
定位Spring配置资源
// 解析配置文件路径#(ResourcePatternResolver).getResources(location)
Bean定义资源的定位
// 使用Spring的Bean规则解析元素节点#parseDefaultElement
BeanDefinitionParserDelegate
// 执行后续操作#loadBeanDefinitions(XmlBeanDefinitionReader)
整体流程说明:
SimpleAliasRegistry
// DocumentLoader将Bean配置信息转换成文档对象#loadDocument
// 根据Spring配置文件的路径,获取资源的Doc对象#loadBeanDefinitions(beanDefinitionReader)
// 在解析Bean定义之前,进行自定义解析,增强解析过程的可扩展性#preProcessXml(root);
PathMatchingResourcePatternResolver
// 2、保存Spring配置文件的路径地址。// 将配置的字符串解析为路径地址setConfigLocations(configLocations);
// 使用子类XmlBeanDefinitionReader的具体实现逻辑来加载资源#loadBeanDefinitions(resources)
// 获取在IoC容器初始化时设置的资源加载器。#getResourceLoader()
// 解析XML<bean>元素,并包装成BeanDefinitionHolder使用#parseBeanDefinitionElement(Element)
AbstractRefreshableApplicationContext
// 解析<alias>标签元素#processAliasRegistration
// 创建和配置新的BeanFactory// BeanFactory定义了IoC容器对外的行为展现,从BeanFactory类图中可以看到,实现类是DefaultListableBeanFactory。#createBeanFactory#customizeBeanFactory
// 在解析Bean定义之后,进行自定义解析,增加解析过程的可扩展性#postProcessXml(root);
// 初始化Bean资源加载器;getResourcePatternResolver()
4、启动IoC容器,载入Bean配置资源。#refresh();
ClassPathXmlApplicationContext
// 具体实现#refreshBeanFactory
// 加载、解析XML配置#loadBeanDefinitions(EncodedResource)
DefaultBeanDefinitionDocumentReader
// 创建Document文档解析器// Spring是委托给BeanDefinitionParserDelegate来完成文档的解析的
// 解析配置资源,获取Bean定义#doRegisterBeanDefinitions
Spring IoC容器初始化详细流程
// 解析<bean>标签元素#processBeanDefinition
// 解析<beans>标签元素的场景#doRegisterBeanDefinitions
// 向Spring IoC容器中注册解析的BeanDefinition#registerBeanDefinition
通过XmlBeanDefinitionReader完成Bean资源的加载#loadBeanDefinitions(BeanFactory)
DefaultDocumentLoader
// 创建XmlBeanDefinitionReader用于读取配置中的Bean。
// 定位、加载、解析配置资源获取Bean定义,然后注册到IoC容器中。#loadBeanDefinitions(beanFactory)
XmlBeanDefinitionReader
BeanDefinitionReaderUtils
// 将解析得到的Bean定义信息注册到Spring IoC容器#registerBeanDefinition
Bean定义资源的加载
Bean定义资源的解析
将Bean注册到IoC容器
// 创建文档解析器#createDocumentBuilder
// 1、调用父类构造方法设置Bean资源加载器。\t\tsuper(parent);
0 条评论
下一页