Spring实现读取配置文件的方法
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容介绍了"Spring实现读取配置文件的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、
千家信息网最后更新 2025年12月03日Spring实现读取配置文件的方法
本篇内容介绍了"Spring实现读取配置文件的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1、XMLBeanFcatory
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));public class XmlBeanFactory extends DefaultListableBeanFactory { //核心代码,XmlBeanFactory中使用了自定义的XmlBeanDefinitionReader读取XML文件 XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory){ //读取XML配置文件的核心代码 this.reader.loadBeanDefinitions(resource); }}2、配置文件封装
加载资源文件可以使用Spring提供的类,如
Resource resource = new ClassPathResource("beanFactory.xml");//getInputStream是在InputStreamResource中定义的唯一方法,它也是Spring对资源封装的最上层接口InputStream inputStream = resource.getInputStream();public interface InputStreamSource { InputStream getInputStream() throws IOException;}public interface Resource extends InputStreamSource { boolean exists(); boolean isReadable(); boolean isOpen(); URL getURL() throws IOException; URI getURI() throws IOException; File getFile() throws IOException; long contentLength() throws IOException; long lastModified() throws IOException; Resource createRelative(String relativePath) throws IOException; String getFilename(); String getDescription();}3、加载资源文件
当使用new ClassPathResource将资源文件封装为Resource之后,就可以使用XmlBeanDefinitionReader来读取配置文件。
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory){ this.reader.loadBeanDefinitions(resource);}public int loadBeanDefinitions(Resource resource){ //EncodedResource主要用于对资源文件的编码处理的 return loadBeanDefinitions(new EncodedResource(resource));}public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { //通过Set来记录已经加载的资源,它是放在ThreadLocal中 Set currentResources = resourcesCurrentlyBeingLoaded.get(); if (currentResources == null) { currentResources = new HashSet(4); //放入ThreadLocal中 this.resourcesCurrentlyBeingLoaded.set(currentResources); } if (!currentResources.add(encodedResource)) { throw new BeanDefinitionStoreException(); } try { //获取文件输入流,上面已经分析过 InputStream inputStream = encodedResource.getResource().getInputStream(); try { InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } //真正进入读取的逻辑核心部分,此处传入的inputSource是org.xml.sax.InputResource,用于sax解析 return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); }}protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource){ try { //步骤1,获取XML文件的验证模式,Spring用来校验验证模式的方法就是判断是否包含DOCTYPE,如果包含就是DTD,否则就是XSD int validationMode = getValidationModeForResource(resource); //步骤2,加载XML文件,并得到对应的Document Document doc = this.documentLoader.loadDocument( inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware()); //步骤3,根据返回的Document注册Bean信息 return registerBeanDefinitions(doc, resource); }}//步骤2public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware){ //SAX解析XML文档,返回Document对象 DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware); DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler); return builder.parse(inputSource);}//步骤3public int registerBeanDefinitions(Document doc, Resource resource) { BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader(); //设置环境变量 documentReader.setEnvironment(this.getEnvironment()); //记录之前BeanDefinition中定义的Bean的数量 int countBefore = getRegistry().getBeanDefinitionCount(); documentReader.registerBeanDefinitions(doc, createReaderContext(resource)); //返回本次加载的BeanDefinition个数 return getRegistry().getBeanDefinitionCount() - countBefore;} 4、开始解析
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext){ this.readerContext = readerContext; //读取的根元素,debug时显示为[beans: null] Element root = doc.getDocumentElement(); doRegisterBeanDefinitions(root);}protected void doRegisterBeanDefinitions(Element root) { //处理profile元素,profile标签可以用于配置生产环境、开发环境等 String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE); if (StringUtils.hasText(profileSpec)) { Assert.state(this.environment != null, "Environment must set for evaluating profiles"); String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS); if (!this.environment.acceptsProfiles(specifiedProfiles)) { return; } } //专门处理解析的代理 BeanDefinitionParserDelegate parent = this.delegate; this.delegate = createDelegate(this.readerContext, root, parent); //此处的两个方法为空实现,面向继承设计,这是模板方法模式,子类可以继承并在解析前做一些处理 preProcessXml(root); parseBeanDefinitions(root, this.delegate); postProcessXml(root); this.delegate = parent;}protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; if (delegate.isDefaultNamespace(ele)) { //解析默认标签,如bean parseDefaultElement(ele, delegate); } else { //解析自定义标签,如 delegate.parseCustomElement(ele); } } } } else { delegate.parseCustomElement(root); }}"Spring实现读取配置文件的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
文件
方法
配置
资源
步骤
处理
就是
标签
核心
模式
环境
封装
代码
元素
内容
更多
知识
验证
实用
学有所成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全 执法 规范
医院需要网络安全备案
同江软件开发
济南直销软件开发
海康威视服务器装win7
宝塔怎么调整数据库上传大小
静安区工业网络技术采购信息
网络安全的标语
数据库写入量
网络安全英语作文模板
网络安全词条
服务器 刷单
华为刀片服务器 管理口
政府网络安全职责
江永租房软件开发
小程序云开发数据库操作放在
皮书数据库包含几大子库
网络安全 宣传材料
服务器只有一个网卡怎么办
惠普服务器可以装系统吗
榆林市政府网络安全
甘肃省宏观数据库
全年网络安全保卫室总结
汕头服务器回收
中小学网络安全教育答案
清远智尚网络技术工作室
tera 服务器列表
互联网高科技产业基地
科技信息与互联网工程技术
VLAN可以增强网络安全性