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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于Xml 的IOC 容器-载入<property>元素

發布時間:2024/4/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Xml 的IOC 容器-载入<property>元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BeanDefinitionParserDelegate 在解析<Bean>調用parsePropertyElements()方法解析<Bean>元素中的<property>屬性子元素,解析源碼如下:

//解析<Bean>元素中的<property>子元素 public void parsePropertyElements(Element beanEle, BeanDefinition bd) {//獲取<Bean>元素中所有的子元素NodeList nl = beanEle.getChildNodes();for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);//如果子元素是<property>子元素,則調用解析<property>子元素方法解析if (isCandidateElement(node) && nodeNameEquals(node, PROPERTY_ELEMENT)) {parsePropertyElement((Element) node, bd);}} } //解析<property>元素 public void parsePropertyElement(Element ele, BeanDefinition bd) {//獲取<property>元素的名字String propertyName = ele.getAttribute(NAME_ATTRIBUTE);if (!StringUtils.hasLength(propertyName)) {error("Tag 'property' must have a 'name' attribute", ele);return;}this.parseState.push(new PropertyEntry(propertyName));try {//如果一個Bean中已經有同名的property存在,則不進行解析,直接返回。//即如果在同一個Bean中配置同名的property,則只有第一個起作用if (bd.getPropertyValues().contains(propertyName)) {error("Multiple 'property' definitions for property '" + propertyName + "'", ele);return;}//解析獲取property的值Object val = parsePropertyValue(ele, bd, propertyName);//根據property的名字和值創建property實例PropertyValue pv = new PropertyValue(propertyName, val);//解析<property>元素中的屬性parseMetaElements(ele, pv);pv.setSource(extractSource(ele));bd.getPropertyValues().addPropertyValue(pv);}finally {this.parseState.pop();} } //解析獲取property值 @Nullable public Object parsePropertyValue(Element ele, BeanDefinition bd, @Nullable String propertyName) {String elementName = (propertyName != null) ?"<property> element for property '" + propertyName + "'" :"<constructor-arg> element";// Should only have one child element: ref, value, list, etc.//獲取<property>的所有子元素,只能是其中一種類型:ref,value,list,etc等NodeList nl = ele.getChildNodes();Element subElement = null;for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);//子元素不是description和meta屬性if (node instanceof Element && !nodeNameEquals(node, DESCRIPTION_ELEMENT) &&!nodeNameEquals(node, META_ELEMENT)) {// Child element is what we're looking for.if (subElement != null) {error(elementName + " must not contain more than one sub-element", ele);}else {//當前<property>元素包含有子元素subElement = (Element) node;}}}//判斷property的屬性值是ref還是value,不允許既是ref又是valueboolean hasRefAttribute = ele.hasAttribute(REF_ATTRIBUTE);boolean hasValueAttribute = ele.hasAttribute(VALUE_ATTRIBUTE);if ((hasRefAttribute && hasValueAttribute) ||((hasRefAttribute || hasValueAttribute) && subElement != null)) {error(elementName +" is only allowed to contain either 'ref' attribute OR 'value' attribute OR sub-element", ele);}//如果屬性是ref,創建一個ref的數據對象RuntimeBeanReference//這個對象封裝了ref信息if (hasRefAttribute) {String refName = ele.getAttribute(REF_ATTRIBUTE);if (!StringUtils.hasText(refName)) {error(elementName + " contains empty 'ref' attribute", ele);}//一個指向運行時所依賴對象的引用RuntimeBeanReference ref = new RuntimeBeanReference(refName);//設置這個ref的數據對象是被當前的property對象所引用ref.setSource(extractSource(ele));return ref;}//如果屬性是value,創建一個value的數據對象TypedStringValue//這個對象封裝了value信息else if (hasValueAttribute) {//一個持有String類型值的對象TypedStringValue valueHolder = new TypedStringValue(ele.getAttribute(VALUE_ATTRIBUTE));//設置這個value數據對象是被當前的property對象所引用valueHolder.setSource(extractSource(ele));return valueHolder;}//如果當前<property>元素還有子元素else if (subElement != null) {//解析<property>的子元素return parsePropertySubElement(subElement, bd);}else {// Neither child element nor "ref" or "value" attribute found.//propery屬性中既不是ref,也不是value屬性,解析出錯返回nullerror(elementName + " must specify a ref or value", ele);return null;} }

通過對上述源碼的分析,我們可以了解在Spring 配置文件中,<Bean>元素中<property>元素的相關配置是如何處理的:

1、ref 被封裝為指向依賴對象一個引用。

2、value 配置都會封裝成一個字符串類型的對象。

3、ref 和value 都通過“解析的數據類型屬性值.setSource(extractSource(ele));”方法將屬性值/引用與所引用的屬性關聯起來。

在方法的最后對于<property>元素的子元素通過parsePropertySubElement ()方法解析,我們繼續分析該方法的源碼,了解其解析過程。

?

總結

以上是生活随笔為你收集整理的基于Xml 的IOC 容器-载入<property>元素的全部內容,希望文章能夠幫你解決所遇到的問題。

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