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)。