1.AbstractApplicationContext.obtainBeanFactory方法中,模版调用
2.AbstractRefreshableApplicationContex.refreshBeanFactory
该方法中会创建 DefaultListableBeanFactory用于收集BeanDefinition对象
会继续模版调用
3.AbstractXMLApplicationContext.loadBeanDefinitions方法
该方法中会进行委托调用
4.XMLBeanDefinitionReader.loadBeanDefinitions
该方法会 进行 模版调用
5.AbstractBeanDefinitionReader.loadBeanDefinitions
该方法会继续模版调用
6.XMLBeanDefinitionReader.loadBeanDefinitions
该方法会调用该类中的方法
7.XMLBeanDefinitionReader.doLoadBeanDefinitions
会继续类内调用
8.XMLBeanDefinitionReader.doLoadDocument
类内方法调用
9.DefaultDocument.loadDocument
通过w3c.dom解析成一个Document对象
10.XmlBeanDefinitionReader.registerBeanDefinitions
继续调用
11.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions
类内调用
12.DefaultBeanDefinitionDocumentReader.parseBeanDefinition
再进行委托调用,解析默认的Bean标签
13.BeanDefinitionParserDelegate.parseBeanDefinitionElement
类内方法调用
14.BeanDefinitionParserDelegate
createBeanDefinition...
解析标签成BeanDefinition对象的属性
15.BeanDefinitionParserDelgate.parseCustomElement
自定义标签需要自己注册标签解析器
自定义标签解析器需要做三个工作
一、自定义标签解析器
最好继承AbstractSimpleBeanDefinitionParser,这样很多基础方法都已经实现,只需要专注doParse方法就行
二、自定义NamespaceHandler,将标签解析器注册到spring容器
最好继承NamespaceHandlerSupport,基本方法都已被实现,只需要重写init方法,将解析器注册到容器
三、在META-INF目录下,创建spring.handlers文件用于url=handler,让spring进行加载注册
通过SPI的加载方式,将uri于命名空间对应,在xml配置时能进行相关提示。