韩城市住房和城乡建设局网站名字做头诗的网站

张小明 2026/1/12 6:24:15
韩城市住房和城乡建设局网站,名字做头诗的网站,杭州大型网站建设,哈尔滨网站建站模板一、XML解析为BeanDefinition的时机 1.1 在Spring生命周期中的位置 XML解析为BeanDefinition发生在Spring容器启动阶段#xff0c;具体时机如下#xff1a; Spring容器启动流程#xff1a; 1. 创建BeanFactory 2. 【XML解析阶段】加载配置文件#xff0c;解析XML#xff0…一、XML解析为BeanDefinition的时机1.1 在Spring生命周期中的位置XML解析为BeanDefinition发生在Spring容器启动阶段具体时机如下Spring容器启动流程 1. 创建BeanFactory 2. 【XML解析阶段】加载配置文件解析XML注册BeanDefinition ← 发生在这里 3. BeanFactoryPostProcessor处理 4. 实例化Bean 5. 依赖注入 6. 初始化Bean 7. 容器就绪1.2 详细执行流程以ClassPathXmlApplicationContext为例// 1. 构造器调用publicClassPathXmlApplicationContext(StringconfigLocation){this(newString[]{configLocation},true,null);}// 2. refresh()方法 - Spring容器启动的核心方法publicvoidrefresh()throwsBeansException{synchronized(this.startupShutdownMonitor){// 准备刷新上下文prepareRefresh();// 【关键步骤】获取BeanFactory在此过程中完成XML解析ConfigurableListableBeanFactorybeanFactoryobtainFreshBeanFactory();// 后续步骤...prepareBeanFactory(beanFactory);postProcessBeanFactory(beanFactory);invokeBeanFactoryPostProcessors(beanFactory);registerBeanPostProcessors(beanFactory);// ...}}// 3. obtainFreshBeanFactory() - 触发XML解析protectedConfigurableListableBeanFactoryobtainFreshBeanFactory(){refreshBeanFactory();// 在这里进行XML解析returngetBeanFactory();}// 4. refreshBeanFactory() - AbstractRefreshableApplicationContextprotectedfinalvoidrefreshBeanFactory(){// 创建BeanFactoryDefaultListableBeanFactorybeanFactorycreateBeanFactory();// 【核心】加载BeanDefinitionloadBeanDefinitions(beanFactory);}// 5. loadBeanDefinitions() - AbstractXmlApplicationContextprotectedvoidloadBeanDefinitions(DefaultListableBeanFactorybeanFactory){// 创建XML的BeanDefinition读取器XmlBeanDefinitionReaderbeanDefinitionReadernewXmlBeanDefinitionReader(beanFactory);// 使用Reader读取XML并注册BeanDefinitionloadBeanDefinitions(beanDefinitionReader);}1.3 时机总结阶段说明发生时机容器refresh()方法的obtainFreshBeanFactory()阶段在Bean实例化之前此时只是注册元数据Bean还未创建在BeanFactoryPostProcessor之前BeanFactoryPostProcessor可以修改BeanDefinition可修改性此阶段注册的BeanDefinition可被后续处理器修改二、XML解析方式详解Spring中主要有两种XML解析方式DOM解析和SAX解析。Spring默认使用DOM解析。2.1 DOMDocument Object Model解析2.1.1 基本原理工作流程 XML文件 → 完整读入内存 → 构建DOM树 → 遍历节点 → 提取信息2.1.2 Spring中的使用Spring通过DocumentLoader加载XML为DOM Document// DefaultDocumentLoader.javapublicDocumentloadDocument(InputSourceinputSource,EntityResolverentityResolver,ErrorHandlererrorHandler,intvalidationMode,booleannamespaceAware){// 创建DocumentBuilderFactoryDocumentBuilderFactoryfactorycreateDocumentBuilderFactory(validationMode,namespaceAware);// 创建DocumentBuilderDocumentBuilderbuildercreateDocumentBuilder(factory,entityResolver,errorHandler);// 解析为Document对象DOM树returnbuilder.parse(inputSource);}2.1.3 解析过程// 1. 加载DocumentDocumentdocdocumentLoader.loadDocument(...);// 2. 获取根元素Elementrootdoc.getDocumentElement();// 3. 遍历解析以bean标签为例NodeListnodeListroot.getElementsByTagName(bean);for(inti0;inodeList.getLength();i){ElementbeanElement(Element)nodeList.item(i);// 4. 提取属性StringidbeanElement.getAttribute(id);StringclassNamebeanElement.getAttribute(class);StringscopebeanElement.getAttribute(scope);// 5. 创建BeanDefinitionBeanDefinitionbdnewGenericBeanDefinition();bd.setBeanClassName(className);bd.setScope(scope);// 6. 解析子元素property、constructor-arg等parsePropertyElements(beanElement,bd);// 7. 注册到BeanFactoryregistry.registerBeanDefinition(id,bd);}2.1.4 优势优势说明随机访问可以随意访问DOM树的任意节点双向遍历可以从父节点到子节点也可以从子节点到父节点易于操作API简单直观便于增删改查支持修改可以修改DOM树的结构和内容支持XPath可以使用XPath快速定位节点2.1.5 劣势劣势说明内存占用大需要将整个XML加载到内存构建DOM树解析速度慢大文件解析时需要较长时间不适合大文件大型XML文件可能导致内存溢出解析前必须完整必须等待整个文档加载完成2.1.6 适用场景✅ Spring配置文件通常较小需要随机访问✅ 需要频繁访问不同节点✅ 需要修改XML内容❌ 超大型XML文件几百MB以上2.2 SAXSimple API for XML解析2.2.1 基本原理工作流程 XML文件 → 边读边解析 → 触发事件 → 事件处理器处理 → 不保留完整树结构SAX采用事件驱动模型// 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. 元素内容事件publicvoidcharacters(char[]ch,intstart,intlength){StringcontentnewString(ch,start,length);// 处理文本内容...}// 4. 元素结束事件publicvoidendElement(Stringuri,StringlocalName,StringqName){if(bean.equals(qName)){// bean标签结束注册BeanDefinition}}// 5. 文档结束事件publicvoidendDocument(){System.out.println(文档解析完成);}}2.2.2 解析过程// 1. 创建SAX解析器工厂SAXParserFactoryfactorySAXParserFactory.newInstance();// 2. 创建解析器SAXParserparserfactory.newSAXParser();// 3. 创建事件处理器MyHandlerhandlernewMyHandler();// 4. 开始解析触发事件parser.parse(newFile(beans.xml),handler);2.2.3 事件触发顺序示例对于以下XML?xml version1.0 encodingUTF-8?beansbeaniduserServiceclasscom.example.UserServicepropertynamenamevaluetest//bean/beansSAX解析触发的事件序列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 优势优势说明内存占用小不需要加载整个文档到内存解析速度快边读边解析无需等待完整加载适合大文件可以处理超大型XML文件流式处理支持流式数据处理2.2.5 劣势劣势说明单向解析只能从前往后解析不能回退无法随机访问不能直接访问特定节点编程复杂需要手动维护状态代码较复杂不能修改无法修改XML内容需要手动管理状态需要在事件处理器中维护上下文信息2.2.6 适用场景✅ 超大型XML文件解析✅ 流式数据处理✅ 内存受限环境❌ 需要随机访问节点❌ 需要修改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);// 处理...}}}特点对比特性SAXStAX模型推式事件驱动拉式迭代器模式控制解析器控制流程应用程序控制流程易用性需要回调处理更直观类似迭代器性能略快略慢2.3.2 JDOM 和 DOM4J这些是第三方XML解析库不是Spring默认使用的方式// 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的内存开销可接受需要随机访问解析bean依赖关系需要随机访问不同节点需要支持命名空间Spring支持自定义命名空间DOM更容易处理易于扩展DOM API更容易实现自定义标签解析向后兼容历史原因保持API稳定性3.2 Spring的优化措施虽然使用DOM但Spring做了很多优化// 1. 延迟加载BeanDefinition// 只在第一次获取Bean时才解析// 2. 缓存解析结果// BeanDefinition注册后会缓存避免重复解析// 3. 支持Lazy注解// 延迟Bean的实例化// 4. 支持条件注册// Conditional可以跳过不必要的Bean注册四、DOM vs SAX 深度对比4.1 技术对比表对比维度DOMSAX解析方式树形结构全部加载事件驱动边读边解析内存占用高与文件大小成正比低固定大小解析速度慢需要构建完整树快流式处理访问方式随机访问顺序访问遍历方向双向单向前向修改能力支持不支持API复杂度简单直观复杂需要状态管理适用场景中小型文件、需要修改大型文件、流式处理XPath支持支持不支持线程安全不安全需要同步每个解析器独立使用4.2 性能对比以10MB的XML文件为例DOM解析 - 内存占用约40-50MB4-5倍文件大小 - 解析时间约2-3秒 - 优势解析后访问快速 SAX解析 - 内存占用约5-10MB固定开销 - 解析时间约0.5-1秒 - 优势内存友好适合大文件4.3 代码复杂度对比DOM解析代码简洁Documentdocbuilder.parse(xmlFile);NodeListbeansdoc.getElementsByTagName(bean);for(inti0;ibeans.getLength();i){Elementbean(Element)beans.item(i);Stringidbean.getAttribute(id);// 直接访问逻辑清晰}SAX解析代码复杂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()){// 需要手动维护状态}}privatebooleanisInBean(){returnelementStack.contains(bean);}// 需要更多状态管理代码...}五、Spring XML解析核心类5.1 核心类图XmlBeanDefinitionReaderXML读取器 ├── DocumentLoader文档加载器 │ └── DefaultDocumentLoader默认实现使用DOM │ ├── BeanDefinitionDocumentReader文档解析器 │ └── DefaultBeanDefinitionDocumentReader │ ├── parseBeanDefinitions() - 解析beans标签 │ └── processBeanDefinition() - 解析bean标签 │ └── BeanDefinitionParserDelegate解析委托 ├── parseBeanDefinitionElement() - 解析bean元素 ├── parsePropertyElements() - 解析property元素 └── parseConstructorArgElements() - 解析constructor-arg元素5.2 关键方法调用链// 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标签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)){// 默认命名空间bean、import、alias等parseDefaultElement(ele,delegate);}else{// 自定义命名空间aop、tx、context等delegate.parseCustomElement(ele);}}}}六、实际应用建议6.1 Spring配置文件优化!-- ❌ 避免单个超大配置文件 --beans!-- 上千个bean定义... --/beans!-- ✅ 推荐拆分为多个模块 --beansimportresourcespring-dao.xml/importresourcespring-service.xml/importresourcespring-web.xml//beans6.2 何时考虑SAX如果需要处理超大型XML非Spring配置场景// 场景处理1GB的数据导出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){// 处理并立即释放不保留在内存}}6.3 现代Spring项目建议// 优先使用注解配置避免XMLConfigurationComponentScan(com.example)publicclassAppConfig{BeanpublicUserServiceuserService(){returnnewUserServiceImpl();}}// 或使用Spring BootSpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站个体户经营范围上海市中小企业服务云

本文深入剖析企业级RAG知识库问答系统的全链路优化策略,从知识提取、分块、嵌入、存储与索引、检索、回答生成到效果评估七大环节,详细阐述各环节的核心选型与优化思路。文章指出低代码平台仅能达到基础水平,真正的精准度提升需通过系统化优化…

张小明 2026/1/2 11:00:56 网站建设

东莞设计网站公司邯郸外贸网站建设公司

经常有小伙伴问我,为什么自己总是挖不到漏洞呢?渗透到底是什么样的流程呢? 所以全网最详细的渗透测试流程来了!!! 全篇文章内容较长,请耐心观看! 文章目录 渗透测试一 确定目标二 信息收集三 漏洞探测四 漏洞利用五 内网转发六 内网横向渗透七 痕迹清除八 撰写渗…

张小明 2026/1/2 15:36:00 网站建设

网络网站建设的意义多用户商城系统哪个好

第一章:PHP 8.6扩展依赖管理的核心变革 PHP 8.6 在扩展生态系统中引入了革命性的依赖管理机制,显著提升了扩展安装、版本协调和运行时兼容性的控制能力。这一变革主要围绕新的声明式依赖描述文件 ext.json 和内置的扩展解析器展开,使开发者能…

张小明 2025/12/31 14:27:24 网站建设

上海公司做网站wordpress免费版

在数字经济蓬勃发展的今天,“数据驱动决策” 已从企业战略口号落地为核心运营逻辑。商务数据分析师作为衔接数据与商业价值的关键角色,正成为各行业争抢的稀缺人才。尤其是金融、零售、电商三大领域,因业务属性与数据密度的特殊性&#xff0c…

张小明 2025/12/30 21:39:38 网站建设

最新被百度收录的网站广州市番禺区建设局网站

引言大赛背景与意义:介绍AI技术在各行业的创新潜力,以及竞赛如何推动技术落地。目标读者:开发者、创业者、技术爱好者。大赛核心主题与技术方向www.yunshengzx.com热门AI技术领域(如生成式AI、计算机视觉、自然语言处理&#xff0…

张小明 2025/12/31 15:17:56 网站建设

微信网站怎么做的做网站不会写代码

350万美元颠覆千亿模型格局:Cogito v2 70B混合推理技术革新 【免费下载链接】cogito-v2-preview-llama-70B 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/cogito-v2-preview-llama-70B 导语 仅用350万美元训练成本,Cogito v2 70B通过独…

张小明 2026/1/11 20:47:19 网站建设