97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

有做網(wǎng)站設(shè)計嗎windows優(yōu)化大師是什么

鶴壁市浩天電氣有限公司 2026/01/24 15:59:29
有做網(wǎng)站設(shè)計嗎,windows優(yōu)化大師是什么,網(wǎng)站關(guān)鍵詞一般設(shè)置幾個,長春做網(wǎng)絡(luò)推廣的公司一、XML解析為BeanDefinition的時機(jī) 1.1 在Spring生命周期中的位置 XML解析為BeanDefinition發(fā)生在Spring容器啟動階段#xff0c;具體時機(jī)如下#xff1a; Spring容器啟動流程#xff1a; 1. 創(chuàng)建BeanFactory 2. 【XML解析階段】加載配置文件#xff0c;解析XML#xff0…一、XML解析為BeanDefinition的時機(jī)1.1 在Spring生命周期中的位置XML解析為BeanDefinition發(fā)生在Spring容器啟動階段具體時機(jī)如下Spring容器啟動流程 1. 創(chuàng)建BeanFactory 2. 【XML解析階段】加載配置文件解析XML注冊BeanDefinition ← 發(fā)生在這里 3. BeanFactoryPostProcessor處理 4. 實(shí)例化Bean 5. 依賴注入 6. 初始化Bean 7. 容器就緒1.2 詳細(xì)執(zhí)行流程以ClassPathXmlApplicationContext為例// 1. 構(gòu)造器調(diào)用publicClassPathXmlApplicationContext(StringconfigLocation){this(newString[]{configLocation},true,null);}// 2. refresh()方法 - Spring容器啟動的核心方法publicvoidrefresh()throwsBeansException{synchronized(this.startupShutdownMonitor){// 準(zhǔn)備刷新上下文prepareRefresh();// 【關(guān)鍵步驟】獲取BeanFactory在此過程中完成XML解析ConfigurableListableBeanFactorybeanFactoryobtainFreshBeanFactory();// 后續(xù)步驟...prepareBeanFactory(beanFactory);postProcessBeanFactory(beanFactory);invokeBeanFactoryPostProcessors(beanFactory);registerBeanPostProcessors(beanFactory);// ...}}// 3. obtainFreshBeanFactory() - 觸發(fā)XML解析protectedConfigurableListableBeanFactoryobtainFreshBeanFactory(){refreshBeanFactory();// 在這里進(jìn)行XML解析returngetBeanFactory();}// 4. refreshBeanFactory() - AbstractRefreshableApplicationContextprotectedfinalvoidrefreshBeanFactory(){// 創(chuàng)建BeanFactoryDefaultListableBeanFactorybeanFactorycreateBeanFactory();// 【核心】加載BeanDefinitionloadBeanDefinitions(beanFactory);}// 5. loadBeanDefinitions() - AbstractXmlApplicationContextprotectedvoidloadBeanDefinitions(DefaultListableBeanFactorybeanFactory){// 創(chuàng)建XML的BeanDefinition讀取器XmlBeanDefinitionReaderbeanDefinitionReadernewXmlBeanDefinitionReader(beanFactory);// 使用Reader讀取XML并注冊BeanDefinitionloadBeanDefinitions(beanDefinitionReader);}1.3 時機(jī)總結(jié)階段說明發(fā)生時機(jī)容器refresh()方法的obtainFreshBeanFactory()階段在Bean實(shí)例化之前此時只是注冊元數(shù)據(jù)Bean還未創(chuàng)建在BeanFactoryPostProcessor之前BeanFactoryPostProcessor可以修改BeanDefinition可修改性此階段注冊的BeanDefinition可被后續(xù)處理器修改二、XML解析方式詳解Spring中主要有兩種XML解析方式DOM解析和SAX解析。Spring默認(rèn)使用DOM解析。2.1 DOMDocument Object Model解析2.1.1 基本原理工作流程 XML文件 → 完整讀入內(nèi)存 → 構(gòu)建DOM樹 → 遍歷節(jié)點(diǎn) → 提取信息2.1.2 Spring中的使用Spring通過DocumentLoader加載XML為DOM Document// DefaultDocumentLoader.javapublicDocumentloadDocument(InputSourceinputSource,EntityResolverentityResolver,ErrorHandlererrorHandler,intvalidationMode,booleannamespaceAware){// 創(chuàng)建DocumentBuilderFactoryDocumentBuilderFactoryfactorycreateDocumentBuilderFactory(validationMode,namespaceAware);// 創(chuàng)建DocumentBuilderDocumentBuilderbuildercreateDocumentBuilder(factory,entityResolver,errorHandler);// 解析為Document對象DOM樹returnbuilder.parse(inputSource);}2.1.3 解析過程// 1. 加載DocumentDocumentdocdocumentLoader.loadDocument(...);// 2. 獲取根元素Elementrootdoc.getDocumentElement();// 3. 遍歷解析以bean標(biāo)簽為例NodeListnodeListroot.getElementsByTagName(bean);for(inti0;inodeList.getLength();i){ElementbeanElement(Element)nodeList.item(i);// 4. 提取屬性StringidbeanElement.getAttribute(id);StringclassNamebeanElement.getAttribute(class);StringscopebeanElement.getAttribute(scope);// 5. 創(chuàng)建BeanDefinitionBeanDefinitionbdnewGenericBeanDefinition();bd.setBeanClassName(className);bd.setScope(scope);// 6. 解析子元素property、constructor-arg等parsePropertyElements(beanElement,bd);// 7. 注冊到BeanFactoryregistry.registerBeanDefinition(id,bd);}2.1.4 優(yōu)勢優(yōu)勢說明隨機(jī)訪問可以隨意訪問DOM樹的任意節(jié)點(diǎn)雙向遍歷可以從父節(jié)點(diǎn)到子節(jié)點(diǎn)也可以從子節(jié)點(diǎn)到父節(jié)點(diǎn)易于操作API簡單直觀便于增刪改查支持修改可以修改DOM樹的結(jié)構(gòu)和內(nèi)容支持XPath可以使用XPath快速定位節(jié)點(diǎn)2.1.5 劣勢劣勢說明內(nèi)存占用大需要將整個XML加載到內(nèi)存構(gòu)建DOM樹解析速度慢大文件解析時需要較長時間不適合大文件大型XML文件可能導(dǎo)致內(nèi)存溢出解析前必須完整必須等待整個文檔加載完成2.1.6 適用場景? Spring配置文件通常較小需要隨機(jī)訪問? 需要頻繁訪問不同節(jié)點(diǎn)? 需要修改XML內(nèi)容? 超大型XML文件幾百M(fèi)B以上2.2 SAXSimple API for XML解析2.2.1 基本原理工作流程 XML文件 → 邊讀邊解析 → 觸發(fā)事件 → 事件處理器處理 → 不保留完整樹結(jié)構(gòu)SAX采用事件驅(qū)動模型// SAX事件處理器publicclassMyHandlerextendsDefaultHandler{// 1. 文檔開始事件publicvoidstartDocument(){System.out.println(開始解析文檔);}// 2. 元素開始事件publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes){if(bean.equals(qName)){Stringidattributes.getValue(id);StringclassNameattributes.getValue(class);// 處理bean定義...}}// 3. 元素內(nèi)容事件publicvoidcharacters(char[]ch,intstart,intlength){StringcontentnewString(ch,start,length);// 處理文本內(nèi)容...}// 4. 元素結(jié)束事件publicvoidendElement(Stringuri,StringlocalName,StringqName){if(bean.equals(qName)){// bean標(biāo)簽結(jié)束注冊BeanDefinition}}// 5. 文檔結(jié)束事件publicvoidendDocument(){System.out.println(文檔解析完成);}}2.2.2 解析過程// 1. 創(chuàng)建SAX解析器工廠SAXParserFactoryfactorySAXParserFactory.newInstance();// 2. 創(chuàng)建解析器SAXParserparserfactory.newSAXParser();// 3. 創(chuàng)建事件處理器MyHandlerhandlernewMyHandler();// 4. 開始解析觸發(fā)事件parser.parse(newFile(beans.xml),handler);2.2.3 事件觸發(fā)順序示例對于以下XML?xml version1.0 encodingUTF-8?beansbeaniduserServiceclasscom.example.UserServicepropertynamenamevaluetest//bean/beansSAX解析觸發(fā)的事件序列1. startDocument() 2. startElement(beans) 3. startElement(bean, {iduserService, classcom.example.UserService}) 4. startElement(property, {namename, valuetest}) 5. endElement(property) 6. endElement(bean) 7. endElement(beans) 8. endDocument()2.2.4 優(yōu)勢優(yōu)勢說明內(nèi)存占用小不需要加載整個文檔到內(nèi)存解析速度快邊讀邊解析無需等待完整加載適合大文件可以處理超大型XML文件流式處理支持流式數(shù)據(jù)處理2.2.5 劣勢劣勢說明單向解析只能從前往后解析不能回退無法隨機(jī)訪問不能直接訪問特定節(jié)點(diǎn)編程復(fù)雜需要手動維護(hù)狀態(tài)代碼較復(fù)雜不能修改無法修改XML內(nèi)容需要手動管理狀態(tài)需要在事件處理器中維護(hù)上下文信息2.2.6 適用場景? 超大型XML文件解析? 流式數(shù)據(jù)處理? 內(nèi)存受限環(huán)境? 需要隨機(jī)訪問節(jié)點(diǎn)? 需要修改XML2.3 其他解析方式2.3.1 StAXStreaming API for XMLStAX是拉式解析Pull Parsing介于DOM和SAX之間XMLInputFactoryfactoryXMLInputFactory.newInstance();XMLStreamReaderreaderfactory.createXMLStreamReader(newFileInputStream(beans.xml));while(reader.hasNext()){inteventreader.next();// 主動拉取事件if(eventXMLStreamConstants.START_ELEMENT){StringtagNamereader.getLocalName();if(bean.equals(tagName)){Stringidreader.getAttributeValue(null,id);StringclassNamereader.getAttributeValue(null,class);// 處理...}}}特點(diǎn)對比特性SAXStAX模型推式事件驅(qū)動拉式迭代器模式控制解析器控制流程應(yīng)用程序控制流程易用性需要回調(diào)處理更直觀類似迭代器性能略快略慢2.3.2 JDOM 和 DOM4J這些是第三方XML解析庫不是Spring默認(rèn)使用的方式// DOM4J示例SAXReaderreadernewSAXReader();Documentdocumentreader.read(newFile(beans.xml));Elementrootdocument.getRootElement();for(Elementbean:root.elements(bean)){Stringidbean.attributeValue(id);StringclassNamebean.attributeValue(class);// 處理...}三、Spring為什么選擇DOM解析3.1 Spring的選擇理由理由說明配置文件通常較小Spring配置文件一般不超過幾MBDOM的內(nèi)存開銷可接受需要隨機(jī)訪問解析bean依賴關(guān)系需要隨機(jī)訪問不同節(jié)點(diǎn)需要支持命名空間Spring支持自定義命名空間DOM更容易處理易于擴(kuò)展DOM API更容易實(shí)現(xiàn)自定義標(biāo)簽解析向后兼容歷史原因保持API穩(wěn)定性3.2 Spring的優(yōu)化措施雖然使用DOM但Spring做了很多優(yōu)化// 1. 延遲加載BeanDefinition// 只在第一次獲取Bean時才解析// 2. 緩存解析結(jié)果// BeanDefinition注冊后會緩存避免重復(fù)解析// 3. 支持Lazy注解// 延遲Bean的實(shí)例化// 4. 支持條件注冊// Conditional可以跳過不必要的Bean注冊四、DOM vs SAX 深度對比4.1 技術(shù)對比表對比維度DOMSAX解析方式樹形結(jié)構(gòu)全部加載事件驅(qū)動邊讀邊解析內(nèi)存占用高與文件大小成正比低固定大小解析速度慢需要構(gòu)建完整樹快流式處理訪問方式隨機(jī)訪問順序訪問遍歷方向雙向單向前向修改能力支持不支持API復(fù)雜度簡單直觀復(fù)雜需要狀態(tài)管理適用場景中小型文件、需要修改大型文件、流式處理XPath支持支持不支持線程安全不安全需要同步每個解析器獨(dú)立使用4.2 性能對比以10MB的XML文件為例DOM解析 - 內(nèi)存占用約40-50MB4-5倍文件大小 - 解析時間約2-3秒 - 優(yōu)勢解析后訪問快速 SAX解析 - 內(nèi)存占用約5-10MB固定開銷 - 解析時間約0.5-1秒 - 優(yōu)勢內(nèi)存友好適合大文件4.3 代碼復(fù)雜度對比DOM解析代碼簡潔Documentdocbuilder.parse(xmlFile);NodeListbeansdoc.getElementsByTagName(bean);for(inti0;ibeans.getLength();i){Elementbean(Element)beans.item(i);Stringidbean.getAttribute(id);// 直接訪問邏輯清晰}SAX解析代碼復(fù)雜publicclassBeanHandlerextendsDefaultHandler{privateStackStringelementStacknewStack();privateBeanDefinitioncurrentBean;publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes){elementStack.push(qName);if(bean.equals(qName)){currentBeannewBeanDefinition();currentBean.setId(attributes.getValue(id));}elseif(property.equals(qName)isInBean()){// 需要手動維護(hù)狀態(tài)}}privatebooleanisInBean(){returnelementStack.contains(bean);}// 需要更多狀態(tài)管理代碼...}五、Spring XML解析核心類5.1 核心類圖XmlBeanDefinitionReaderXML讀取器 ├── DocumentLoader文檔加載器 │ └── DefaultDocumentLoader默認(rèn)實(shí)現(xiàn)使用DOM │ ├── BeanDefinitionDocumentReader文檔解析器 │ └── DefaultBeanDefinitionDocumentReader │ ├── parseBeanDefinitions() - 解析beans標(biāo)簽 │ └── processBeanDefinition() - 解析bean標(biāo)簽 │ └── BeanDefinitionParserDelegate解析委托 ├── parseBeanDefinitionElement() - 解析bean元素 ├── parsePropertyElements() - 解析property元素 └── parseConstructorArgElements() - 解析constructor-arg元素5.2 關(guān)鍵方法調(diào)用鏈// 1. XmlBeanDefinitionReader.loadBeanDefinitions()publicintloadBeanDefinitions(Resourceresource){returnloadBeanDefinitions(newEncodedResource(resource));}// 2. doLoadBeanDefinitions()protectedintdoLoadBeanDefinitions(InputSourceinputSource,Resourceresource){// 加載Document使用DOMDocumentdocdoLoadDocument(inputSource,resource);// 注冊BeanDefinitionreturnregisterBeanDefinitions(doc,resource);}// 3. registerBeanDefinitions()publicintregisterBeanDefinitions(Documentdoc,Resourceresource){BeanDefinitionDocumentReaderdocumentReadercreateBeanDefinitionDocumentReader();// 委托給DocumentReader處理documentReader.registerBeanDefinitions(doc,createReaderContext(resource));}// 4. DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions()protectedvoiddoRegisterBeanDefinitions(Elementroot){BeanDefinitionParserDelegateparentthis.delegate;this.delegatecreateDelegate(getReaderContext(),root,parent);// 解析beans標(biāo)簽parseBeanDefinitions(root,this.delegate);}// 5. parseBeanDefinitions() - 遍歷子元素protectedvoidparseBeanDefinitions(Elementroot,BeanDefinitionParserDelegatedelegate){NodeListnlroot.getChildNodes();for(inti0;inl.getLength();i){Nodenodenl.item(i);if(nodeinstanceofElement){Elementele(Element)node;if(delegate.isDefaultNamespace(ele)){// 默認(rèn)命名空間bean、import、alias等parseDefaultElement(ele,delegate);}else{// 自定義命名空間aop、tx、context等delegate.parseCustomElement(ele);}}}}六、實(shí)際應(yīng)用建議6.1 Spring配置文件優(yōu)化!-- ? 避免單個超大配置文件 --beans!-- 上千個bean定義... --/beans!-- ? 推薦拆分為多個模塊 --beansimportresourcespring-dao.xml/importresourcespring-service.xml/importresourcespring-web.xml//beans6.2 何時考慮SAX如果需要處理超大型XML非Spring配置場景// 場景處理1GB的數(shù)據(jù)導(dǎo)出XMLpublicclassLargeXmlProcessorextendsDefaultHandler{privateintrecordCount0;OverridepublicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes){if(record.equals(qName)){// 處理單條記錄processRecord(attributes);recordCount;if(recordCount%100000){System.out.println(Processed recordCount records);}}}privatevoidprocessRecord(Attributesattributes){// 處理并立即釋放不保留在內(nèi)存}}6.3 現(xiàn)代Spring項目建議// 優(yōu)先使用注解配置避免XMLConfigurationComponentScan(com.example)publicclassAppConfig{BeanpublicUserServiceuserService(){returnnewUserServiceImpl();}}// 或使用Spring BootSpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

凡科建站怎么導(dǎo)出網(wǎng)頁淘寶上找人做網(wǎng)站

凡科建站怎么導(dǎo)出網(wǎng)頁,淘寶上找人做網(wǎng)站,p2p網(wǎng)站建設(shè)方案策劃書,集團(tuán)網(wǎng)站建設(shè)活動方案WebAssembly為何能實(shí)現(xiàn)極致性能#xff1a;從設(shè)計原理到執(zhí)行優(yōu)勢 1. 底層架構(gòu)的本質(zhì)差異 1.1 執(zhí)行

2026/01/23 16:03:01

音樂網(wǎng)站建設(shè)的意義如何安裝網(wǎng)站程序

音樂網(wǎng)站建設(shè)的意義,如何安裝網(wǎng)站程序,北京國互網(wǎng)網(wǎng)站建設(shè)價格,做網(wǎng)站開發(fā) 用什么軟件前言 27 歲女生從傳統(tǒng)行業(yè)裸辭轉(zhuǎn)網(wǎng)絡(luò)安全#xff0c;3 個月拿到大廠 offer#xff1a;這行真的沒你想的

2026/01/23 06:21:01

臺州網(wǎng)站設(shè)計 解放路旅游網(wǎng)站制作過程

臺州網(wǎng)站設(shè)計 解放路,旅游網(wǎng)站制作過程,織夢快速建站,設(shè)計廣告公司網(wǎng)站建設(shè)Python基于大數(shù)據(jù)技術(shù)的購房推薦系統(tǒng)的設(shè)計與實(shí)現(xiàn)是一個復(fù)雜但具有廣泛應(yīng)用前景的項目。以下是對該系統(tǒng)的詳細(xì)介紹#xff1a;

2026/01/21 18:41:02

wordpress會員制訂閱服務(wù)好的鎮(zhèn)江網(wǎng)站優(yōu)化

wordpress會員制訂閱,服務(wù)好的鎮(zhèn)江網(wǎng)站優(yōu)化,品牌建設(shè)方案怎么寫,京津冀協(xié)同發(fā)展調(diào)研報告在現(xiàn)代軟件開發(fā)中#xff0c;一個優(yōu)秀的后臺管理系統(tǒng)往往決定著整個項目的成敗。art-design-pro

2026/01/23 14:17:01