javascript
Spring bean 标签加载、解析过程分析
概述
上一篇【Spring 加載、解析applicationContext.xml 流程】分析了從xml文件加載到開始解析xml里面的標簽為止,基本都是跟spring 真正的核心沒什么關系。
這篇我們分析 applicationContext.xml 中的bean 標簽解析。
parseDefaultElement() 方法
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.java
processBeanDefinition() 方法
1. 解析bean標簽(id、name、alias、class、score …),并封裝成BeanDefinitionHolder 對象返回。
2. decoreBeanDefinitionIfRequired() 方法解析自定義標簽,如果bean標簽中包含自定義標簽,則解析自定義標簽
3. bean解析完成后,對bdHolder 進行注冊。
parseBeanDefinitionElement() 方法
解析id和name屬性,name屬性可以配置多個值,以逗號分割。name中的值相當于中配置的值
1. 調用parseBeanDefinitionElement()方法,解析bean標簽的其它屬性,返回一個GenericBeanDefinition對象
2. 判斷beanName是否有值,如果沒有則自動生成beanName
3. 構造BeanDefinitionHolder 對象,并返回
parseBeanDefinitionElement() 方法
1. 創建 GenericBeanDefinition 對象
2. 解析bean的所有屬性
3. 解析 標簽
4. 解析 標簽
5. 解析 標簽
6. 解析 標簽
7. 解析 標簽
8. 解析 標簽
9. 解析 標簽
1. 創建 GenericBeanDefinition 對象
createBeanDefinition()方法
創建GenericBeanDefinition實例
GenericBeanDefinition 繼承了 AbstractBeanDefinition。
AbstractBeanDefinition 對應這一個標簽,bean標簽中每一個屬性都能在AbstractBeanDefinition 中找到對應的元素。
2. 解析bean的所有屬性
AbstractBeanDefinition() 方法
解析bean標簽的各種屬性, 然后存儲到GenericBeanDefinition 對象中,并返回。
3. 解析 標簽
調用DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT)方法解析
4. 解析 標簽
5. 解析 標簽
6. 解析 標簽
7. 解析 標簽
1. 解析index、type、name 屬性
2. 構造ConstructorArgumentValues.ValueHolder對象,把name、type、name、value存儲到該對象中
3. 如果有index屬性,則把 valueHolder 存儲到ConstructorArgumentValues.indexedArgumentValues 屬性中
4. 如果沒有index屬性,則把valueHolder存儲到ConstructorArgumentValues .genericArgumentValues 屬性中
ConstructorArgumentValues 類結構
public class ConstructorArgumentValues {private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>(0);private final List<ValueHolder> genericArgumentValues = new LinkedList<>();......public static class ValueHolder implements BeanMetadataElement {@Nullableprivate Object value;@Nullableprivate String type;@Nullableprivate String name;@Nullableprivate Object source;private boolean converted = false;@Nullableprivate Object convertedValue;......} }8. 解析 標簽
解析的子標簽
parsePropertyElement()
調用parsePropertyValue() 方法獲取property的值。
parsePropertyValue() 方法
1. 獲取子標簽,并跳過 meta 和 description 標簽的解析
2. 獲取 property 的ref 和value 的屬性。
3. 如果即存在 ref 屬性又存在 value 屬性,或者存在ref 或value 屬性的同時還存在子標簽,則標簽規則錯誤。
1. 如果存在ref 屬性,則使用RuntimeBeanReference對象封裝ref
2. 如果存在value屬性,則使用TypeStringValue封裝
3. 如果存在子標簽則處理解析子標簽
解析子標簽 parsePropertySubElement()
1. 如果不是默認的標簽,則執行嵌套自定義標簽解析
2. 解析bean標簽
3. 解析ref 標簽
4. 解析idref 標簽
5. 解析value標簽
6. 解析null標簽
7. 解析array標簽
8. 解析list標簽
9. 解析set 標簽
10. 解析map標簽
11. 解析prop標簽
9. 解析 標簽
解析完bean的所有屬性,子標簽后和自定義標簽后存儲到 GenericBeanDefinition 對象中,然后調用DefaultListableBeanFactory.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());把beanDefinitoin注冊到 beanDefinitionMap中。
beanDefinitionMap 定義
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);想了解更多精彩內容請關注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Spring bean 标签加载、解析过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring mvc ContextLo
- 下一篇: Spring mvc DispatchS