日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring bean 标签加载、解析过程分析

發布時間:2024/9/30 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring bean 标签加载、解析过程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

上一篇【Spring 加載、解析applicationContext.xml 流程】分析了從xml文件加載到開始解析xml里面的標簽為止,基本都是跟spring 真正的核心沒什么關系。
這篇我們分析 applicationContext.xml 中的bean 標簽解析。

parseDefaultElement() 方法

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.java

  • 解析 import 標簽
  • 解析 alias 標簽
  • 解析 bean 標簽
  • 解析 beans 標簽
  • 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 對象中,并返回。

    <!-- 配置的bean標簽屬性 --> <bean id="" name="" class="" lazy-init="default" abstract="true" autowire-candidate="default" autowire="default" depends-on="" destroy-method="" factory-bean="" factory-method="" init-method="" primary="true" scope="" />

    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 标签加载、解析过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。