Spring解析默认标签的流程概括来讲就是,将root下的element节点转换成beanDefinition,然后将beanName和beanDefiniton放到beanDefinitionMap里(这里的
beanDefinitionMap是一个ConcurrentHashMap实例,它存放在DefaultListableBeanFactory里)。
具体流程是这样的:我们从函数doRegisterBeanDefinitions(root)进来,从根到叶子迭代地处理每个元素,如果元素里的标签是beans,就调用doRegisterBeanDefiniton(ele)处理,如果元素里的标签是bean,就调用processBeanDefinition(ele,delegate)处理。
doRegisterBeanDefiniton(root) ->
parseBeanDefinitons(root,delegate) ->
parseDefaultElement(ele,delegate) -> case1:标签是beans -> doRegisterBeanDefinition(ele) ->
-> case2:标签是bean -> processBeanDefinition(ele,delegate) ->
这里root元素的标签也是beans,每个beans标签都对应一个BeanDefinitionParserDelegate实例和一个doRegisterBeanDefinition方法。
跳出迭代后,主要就是标签bean的解析。processBeanDefinition(ele,delegate)是解析bean标签的函数,主要做了两件事:
(1).通过delegate.parseBeanDefinitonElement(ele)解析元素生成BeanDefinitionHolder实例bdHolder;
(2).注册bdHolder,也就是将beanName和beanDefinition写入beanDefinitionMap;
bdHolder包含beanName,beanDefinition,aliasesArray。一般情况下beanName就是<bean>...</bean>里的id;如果id没有值,那beanName就是aliases里的第一个;如果aliases也没有值,那beanName就是bean对应的类的类名。beanDefinition是这里的核心。获得这个beanDefinition的方法是beanDefinitionParserDelegate.parseBeanDefinitonElement(ele,beanName,null)。