Spring实现读取配置文件的方法
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"Spring实现读取配置文件的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
新华互联网科技
广东猪兼强互联网科技有限公司
互联网品科技
智能科技公司是互联网公司吗
网络科技有限互联网
关于新基建和互联网科技
互联网科技公司怎么样
互联网科技logo设计
互联网科技股午盘股票涨跌
央行互联网金融科技公司
昊天互联网科技有限公司
华夏互联网科技业
注册互联网科技公司经营范围大全
哈尔滨屹滨互联网科技有限公司
互联网新科技动漫ppt素材
科技互联网海报
互联网科技手机排行榜
求路客互联网科技电话
陕西彩京云互联网科技有限公司
互联网科技大佬云集
深圳互联网科技公司
科技与互联网发展
科技服务与互联网
金融科技和互联网金融
中国最先进互联网科技公司
城市宝互联网科技有限公司
卡尔迅互联网科技有限公司
科技和互联网行业的特点
亚光科技低轨卫星互联网
广州全民伙伴互联网科技有限公司