基于Xml 的IOC 容器-载入<property>的子元素
生活随笔
收集整理的這篇文章主要介紹了
基于Xml 的IOC 容器-载入<property>的子元素
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在BeanDefinitionParserDelegate 類中的parsePropertySubElement()方法對<property>中的子元素解析,源碼如下:
//解析<property>元素中ref,value或者集合等子元素 @Nullable public Object parsePropertySubElement(Element ele, @Nullable BeanDefinition bd, @Nullable String defaultValueType) {//如果<property>沒有使用Spring默認的命名空間,則使用用戶自定義的規則解析內嵌元素if (!isDefaultNamespace(ele)) {return parseNestedCustomElement(ele, bd);}//如果子元素是bean,則使用解析<Bean>元素的方法解析else if (nodeNameEquals(ele, BEAN_ELEMENT)) {BeanDefinitionHolder nestedBd = parseBeanDefinitionElement(ele, bd);if (nestedBd != null) {nestedBd = decorateBeanDefinitionIfRequired(ele, nestedBd, bd);}return nestedBd;}//如果子元素是ref,ref中只能有以下3個屬性:bean、local、parentelse if (nodeNameEquals(ele, REF_ELEMENT)) {// A generic reference to any name of any bean.//可以不再同一個Spring配置文件中,具體請參考Spring對ref的配置規則String refName = ele.getAttribute(BEAN_REF_ATTRIBUTE);boolean toParent = false;if (!StringUtils.hasLength(refName)) {// A reference to the id of another bean in a parent context.//獲取<property>元素中parent屬性值,引用父級容器中的BeanrefName = ele.getAttribute(PARENT_REF_ATTRIBUTE);toParent = true;if (!StringUtils.hasLength(refName)) {error("'bean' or 'parent' is required for <ref> element", ele);return null;}}if (!StringUtils.hasText(refName)) {error("<ref> element contains empty target attribute", ele);return null;}//創建ref類型數據,指向被引用的對象RuntimeBeanReference ref = new RuntimeBeanReference(refName, toParent);//設置引用類型值是被當前子元素所引用ref.setSource(extractSource(ele));return ref;}//如果子元素是<idref>,使用解析ref元素的方法解析else if (nodeNameEquals(ele, IDREF_ELEMENT)) {return parseIdRefElement(ele);}//如果子元素是<value>,使用解析value元素的方法解析else if (nodeNameEquals(ele, VALUE_ELEMENT)) {return parseValueElement(ele, defaultValueType);}//如果子元素是null,為<property>設置一個封裝null值的字符串數據else if (nodeNameEquals(ele, NULL_ELEMENT)) {// It's a distinguished null value. Let's wrap it in a TypedStringValue// object in order to preserve the source location.TypedStringValue nullHolder = new TypedStringValue(null);nullHolder.setSource(extractSource(ele));return nullHolder;}//如果子元素是<array>,使用解析array集合子元素的方法解析else if (nodeNameEquals(ele, ARRAY_ELEMENT)) {return parseArrayElement(ele, bd);}//如果子元素是<list>,使用解析list集合子元素的方法解析else if (nodeNameEquals(ele, LIST_ELEMENT)) {return parseListElement(ele, bd);}//如果子元素是<set>,使用解析set集合子元素的方法解析else if (nodeNameEquals(ele, SET_ELEMENT)) {return parseSetElement(ele, bd);}//如果子元素是<map>,使用解析map集合子元素的方法解析else if (nodeNameEquals(ele, MAP_ELEMENT)) {return parseMapElement(ele, bd);}//如果子元素是<props>,使用解析props集合子元素的方法解析else if (nodeNameEquals(ele, PROPS_ELEMENT)) {return parsePropsElement(ele);}//既不是ref,又不是value,也不是集合,則子元素配置錯誤,返回nullelse {error("Unknown property sub-element: [" + ele.getNodeName() + "]", ele);return null;} }通過上述源碼分析,我們明白了在Spring 配置文件中,對<property>元素中配置的array、list、set、map、prop 等各種集合子元素的都通過上述方法解析,生成對應的數據對象,比如ManagedList、ManagedArray、ManagedSet 等,這些Managed 類是Spring 對象BeanDefiniton 的數據封裝,對集合數據類型的具體解析有各自的解析方法實現,解析方法的命名非常規范,一目了然,我們對<list>集合元素的解析方法進行源碼分析,了解其實現過程。
?
總結
以上是生活随笔為你收集整理的基于Xml 的IOC 容器-载入<property>的子元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Xml 的IOC 容器-载入<pro
- 下一篇: 基于Xml 的IOC 容器-载入<lis