`

java与Spring中的资源加载

 
阅读更多

java Resource 资源加载: 

     xml properties  包名路径 

     1 ClassLoad.getResource(String str); 

     2 Class.getResource(Stirng str); 
     
     看第二种加载方式的内部一段代码 

Java代码  收藏代码
  1. private String resolveName(String name) {  
  2.         if (name == null) {  
  3.             return name;  
  4.         }  
  5.         if (!name.startsWith("/")) {  
  6.             Class c = this;  
  7.             while (c.isArray()) {  
  8.                 c = c.getComponentType();  
  9.             }  
  10.             String baseName = c.getName();  
  11.             int index = baseName.lastIndexOf('.');  
  12.             if (index != -1) {  
  13.                 name = baseName.substring(0, index).replace('.''/')  
  14.                     +"/"+name;  
  15.             }  
  16.         } else {  
  17.             name = name.substring(1);  
  18.         }  
  19.         return name;  
  20.     }  


这就说明了 

1最终都是通过ClassLoad进行加载的 

2第二种方式是可以使用相对路径的,也就是资源相对于本类路径下的路径 
如果本来的包名为com.xx.test 下面有一个xx.xml文件和xx.java类。 
我们在xx.java类中想加载xx.xml。那么它的路径可以写为: 
/com/xx/xx.xml 或者是 xx.cml。 

同样的道理如果test包下面还有一个text包,这个包里面有一个yy.java 
那么相对路径就是../xx.xml就可以加载到资源。 

如果是ClassLoad.getResource(str);这种方式只能写路径的全限定名,不加“/”,也就是com/xx/xx.xml 

后又测试了几种文件xml properties 和包路径是可以的 但是java类却不行后追踪源码发现 

Java代码  收藏代码
  1. private ClassLoader parent;  
  2. public URL getResource(String name) {  
  3.     URL url;  
  4.     if (parent != null) {  
  5.         url = parent.getResource(name);  
  6.     } else {  
  7.         url = getBootstrapResource(name);  
  8.     }  
  9.     if (url == null) {  
  10.         url = findResource(name);  // return null  
  11.     }  
  12.     return url;  
  13.    }  



     这里我们可以看到加载顺序是会始终找到它的父类或者祖先类直到没有了父类为止 
然后到Bootstrap(基本类装入器是不能有java代码实例化的,由JVM控制)加载。 
     
部分源码: 

Java代码  收藏代码
  1. private static URL getBootstrapResource(String name) {  
  2.        try {  
  3.            // If this is a known JRE resource, ensure that its bundle is  
  4.            // downloaded.  If it isn't known, we just ignore the download  
  5.            // failure and check to see if we can find the resource anyway  
  6.            // (which is possible if the boot class path has been modified).  
  7.            sun.jkernel.DownloadManager.getBootClassPathEntryForResource(name);  
  8.        } catch (NoClassDefFoundError e) {  
  9.            // This happens while Java itself is being compiled; DownloadManager  
  10.            // isn't accessible when this code is first invoked.  It isn't an  
  11.            // issue, as if we can't find DownloadManager, we can safely assume  
  12.            // that additional code is not available for download.  
  13.        }  
  14.     URLClassPath ucp = getBootstrapClassPath();  
  15.     Resource res = ucp.getResource(name);  
  16.     return res != null ? res.getURL() : null;  
  17.    }  




测试代码: 
     测试类结构图: 

Java代码  收藏代码
  1.   com.xx.MyTest  
  2.     - com.xx.text.MyTestC  
  3.   appconfig.xml  
  4.   appconfig.properties  
  5.   
  6. public class MyTest {  
  7.   
  8.     @Test  
  9.     public void testResource() throws IOException {  
  10.   
  11.           
  12.         URL url3 = this.getClass().getResource("appconfig.xml");  
  13.         //or URL url3 = this.getClass().getResource("/com/xx/MyTest/appconfig.xml");  
  14.         URL url4 = this.getClass().getClassLoader().getResource("com/xx/MyTest/appconfig.properties");  
  15.   
  16.         System.out.println(url4.getFile());  
  17.         System.out.println(url3.getFile());  
  18.     }  
  19.   
  20.   
  21.     public URL printResourceCs(String str) throws IOException {  
  22.   
  23.         URL url3 = this.getClass().getResource(str);  
  24.   
  25.         System.out.println(url3.getFile());  
  26.   
  27.         return url3;  
  28.     }  
  29.   
  30.     public URL printResourceCL(String str) throws IOException {  
  31.   
  32.         URL url3 = this.getClass().getClassLoader().getResource(str);  
  33.   
  34.         System.out.println(url3.getFile());  
  35.   
  36.         return url3;  
  37.     }  
  38. }  



为了测试继承关系得到的基础url: 

Java代码  收藏代码
  1. public class MyTestC extends MyTest {  
  2.       
  3.     @Test  
  4.     public void testA() throws IOException {  
  5.         Assert.assertNotNull(printResourceCs("../appConfig.xml"));  
  6.         Assert.assertNotNull(printResourceCL("sl/ewfs/dms/action/appConfig.xml"));  
  7.     }  
  8. }  




应用: 

1 当我们需要加载xml,或者properties 配置文件时,有时候需要这样做。 

2 利用ClassLoad我们可以得到项目运行是的根目录getClassLoader().getResource("")即可 

附上加载properties 代码: 

Java代码  收藏代码
  1.        
  2. public void  loadPropertiesFromXML(String XMLPath) throws IOException {        URL url = getClass().getResource(XMLPath);  
  3.         InputStream is = null;  
  4.         URLConnection con = null;  
  5.         Properties p = new Properties();  
  6.         try {  
  7.             con = url.openConnection();  
  8.             p.loadFromXML(is = con.getInputStream());            //p.load(is = con.getInputStream());        } catch (IOException e) {  
  9.             throw e;  
  10.         } finally {  
  11.             if (is != null) {  
  12.                 try {  
  13.                     is.close();  
  14.                 } catch (IOException e) {  
  15.                     e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.  
  16.                 }  
  17.             }  
  18.   
  19.         }  
  20.     }  



再来看看Spring的资源加载: 
Spring的Resource接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。 

对应层次图 

 

uml: 



其中,最常用的有四个: 

ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问; 

FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问; 

ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问; 

UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”。 

当然你也可以通过ApplicationContext 来取得Resource 
这会带来少许的方便,因为当你可以实现ApplicationContextAware来方便的得到ApplicationContext 
然后使用 

Java代码  收藏代码
  1. applicationContext.getResource("commons/lib/xx/xx.xx").getFile().getAbsolutePath()  



就可以得到资源的绝对路径 

下段是applicationContext getResource 的代码 

Java代码  收藏代码
  1. String CLASSPATH_URL_PREFIX = “classPath”;  
  2. public Resource getResource(String location) {  
  3.           Assert.notNull(location, "Location must not be null");  
  4.           if (location.startsWith(CLASSPATH_URL_PREFIX)) {  
  5.                return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());  
  6.           }  
  7.           else {  
  8.                try {  
  9.                     // Try to parse the location as a URL...  
  10.                     URL url = new URL(location);  
  11.                     return new UrlResource(url);  
  12.                }  
  13.                catch (MalformedURLException ex) {  
  14.                     // No URL -> resolve as resource path.  
  15.                     return getResourceByPath(location);  
  16.                }  
  17.           }  
  18.      }  





Resource参考: 
http://wade6.iteye.com/blog/1706941 

http://jinnianshilongnian.iteye.com/blog/1416319 

http://jinnianshilongnian.iteye.com/blog/1416320 

http://jinnianshilongnian.iteye.com/blog/1416321 

http://jinnianshilongnian.iteye.com/blog/1416322 

java 类加载机制:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/

分享到:
评论

相关推荐

    台州市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    perl516-perl-Time-Piece-1.20.1-19.el6.centos.alt.x86_64.rpm

    perl516-perl-Time-Piece-1.20.1-19.el6.centos.alt.x86_64.rpm

    基于蒙特卡洛模拟的电动汽车接入对配电网影响研究:灵活容量预测、潮流计算与电压稳定性优化分析,基于蒙特卡洛法的电动汽车无序接入对配电网影响的分析 采用蒙特卡洛法对电动汽车的接入容量进行预测 再将预测

    基于蒙特卡洛模拟的电动汽车接入对配电网影响研究:灵活容量预测、潮流计算与电压稳定性优化分析,基于蒙特卡洛法的电动汽车无序接入对配电网影响的分析 采用蒙特卡洛法对电动汽车的接入容量进行预测 再将预测的结果接入IEEE33节点配电网 通过对配电网的潮流计算 得到接入前后对电网电压和网损的影响 这个接入的数目也是可以灵活改变的 这段程序主要是对一个电力系统进行潮流计算和优化。下面我将对程序的功能、应用领域、工作内容、主要思路进行详细解释。 1. 功能和应用领域: 这段程序的功能是对一个电力系统进行潮流计算和优化。潮流计算是电力系统中的一种重要分析方法,用于计算系统中各节点的电压幅值和相位角,以及各支路的功率损耗。优化是指对系统进行调整,以减小功率损耗、提高电压稳定性等方面的指标。这种潮流计算和优化在电力系统规划、运行和管理中具有重要的应用价值。 2. 工作内容: 这段程序包含了多个函数和主程序,下面将逐个进行解释。 - 主程序: - 清除工作区和命令窗口中的变量和数据。 - 从文件中加载负荷数据,并进行单位转。 - 调用函数`car

    蓄电池与超级电容混合储能系统仿真模型:功率分配与波动抑制研究,基于Matlab Simulink平台实现,结合低通滤波器与智能SOC管理策略,蓄电池与超级电容混合储能并网matlab simulink

    蓄电池与超级电容混合储能系统仿真模型:功率分配与波动抑制研究,基于Matlab Simulink平台实现,结合低通滤波器与智能SOC管理策略,蓄电池与超级电容混合储能并网matlab simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较低时状态与其相反。 ,核心关键词:混合储能; MATLAB Simulink仿真模型; 功率分配; 低通滤波器; 功率波动抑制; 能量管理; 超级电容SOC; 蓄电池。,"混合储能系统:Matlab Simulink仿真模型中低通滤波器与SOC能量管理优化"

    医疗废物信息化管理系统建设方案

    该文档是医疗废物信息化管理系统建设方案,围绕医疗废物管理展开。先介绍政策历程,因医疗废物危害大,国家出台多项政策推动信息化管理。接着阐述建设背景,指出当前医废管理存在纸质单据缺陷、流程不规范等问题。随后详细说明解决方案,涵盖系统应用、业务流程等。功能设计部分分别介绍卫健委局端、医院端、处置公司的功能,如数据展示、医废采集入库出库、人员管理等,旨在实现医废精准管理、全程追溯和闭环监管。

    syslinux-perl-4.05-15.el7.x64-86.rpm.tar.gz

    1、文件内容:syslinux-perl-4.05-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/syslinux-perl-4.05-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于Matlab Simulink的单向Boost PFC与全桥LLC串联谐振开关电源仿真模型:2kw功率输出48V,谐振频率100kHz及输出电压闭环PFM控制,单向Boost PFC+全桥LLC

    基于Matlab Simulink的单向Boost PFC与全桥LLC串联谐振开关电源仿真模型:2kw功率输出48V,谐振频率100kHz及输出电压闭环PFM控制,单向Boost PFC+全桥LLC串联谐振开关电源Matlab simulink仿真模型 2kw功率,输出48V,谐振频率100k LLC使用输出电压闭环 PFM控制 ,核心关键词:单向Boost;PFC+全桥LLC;串联谐振开关电源;Matlab simulink仿真模型;2kw功率;输出48V;谐振频率100k;LLC输出电压闭环;PFM控制;,"Matlab Simulink仿真模型:2kW全桥LLC谐振电源的Boost-PFC研究"

    perl516-perl-File-Slurp-9999.19-10.el6.centos.alt.noarch.rpm

    perl516-perl-File-Slurp-9999.19-10.el6.centos.alt.noarch.rpm

    python项目实战之基于深度学习的电影评论情感分析源码+报告PDF

    python项目实战之基于深度学习的电影评论情感分析源码+报告PDF,个人大三设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做课程设计大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度

    weixin079-springboot智能校园点餐管理系统设计(论文+PPT).zip

    标题SpringBoot智能校园点餐管理系统设计AI更换标题第1章引言介绍智能校园点餐管理系统的背景、意义以及本文的设计目标和主要内容。1.1研究背景与意义分析校园点餐的现状及问题,阐述智能点餐系统的必要性和优势。1.2设计目标与内容明确系统的设计目标,概述论文的主要研究内容和结构安排。第2章系统需求分析对智能校园点餐管理系统的功能需求和非功能需求进行详细分析。2.1功能需求分析列举系统应具备的各项功能,如菜品浏览、点餐、支付等。2.2非功能需求分析分析系统的性能、安全性、可靠性等非功能需求。第3章系统设计根据需求分析,设计系统的整体架构、功能模块和数据库。3.1系统架构设计设计系统的整体架构,包括前后端分离、微服务架构等。3.2功能模块设计详细设计系统的各个功能模块,如用户管理、菜品管理、订单管理等。3.3数据库设计设计系统的数据库结构,包括表结构、数据字典等。第4章系统实现阐述系统的具体实现过程,包括开发环境、技术选型、关键代码实现等。4.1开发环境与技术选型介绍系统的开发环境,选择合适的技术栈和工具。4.2关键代码实现展示系统关键功能的代码实现,如用户登录、菜品展示、订单生成等。

    基于改进Fi-GNN模型的CTR预估方法.pdf

    基于改进Fi-GNN模型的CTR预估方法.pdf

    MAKINO系列机床操作与维修设定指南:PRO3操作、V55维护、报警表及作业规范手册,MAKINO 牧野 PRO3 维修设定操作 A55 PRO3操作说明书 日文.pdf A55卧加工作台旋转后加

    MAKINO系列机床操作与维修设定指南:PRO3操作、V55维护、报警表及作业规范手册,MAKINO 牧野 PRO3 维修设定操作 A55 PRO3操作说明书 日文.pdf A55卧加工作台旋转后加工原点计算.xlsx A61_SPECS.pdf MAKINO PRO3 V55-Operation-Guide 英文.pdf MAKINO S 系列PRO5 使用说明书PIC-Makino-S33-S56-0209.pdf MAKINO 培训课程Schulung_英文.pdf MAKINO-F3F5安装手册MANUAL 英文.pdf Makino-GF8主轴头取汲说明书.pdf MAKINO-PRO3-ProgManua英文l.pdf PIC-Makino-a61-0209.pdf V33 V55 -Series-Operation-485a-9911e英文.pdf V55-Maintenance-Guide-4v2b1563英文.pdf 牧野J5机床说明书J5_OPERATION_中文.pdf 牧野Professional5使用说明书摘要(a1系列 a51 a61 a71 a81 a8

    sgml-common-0.6.3-39.el7.x64-86.rpm.tar.gz

    1、文件内容:sgml-common-0.6.3-39.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sgml-common-0.6.3-39.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于ST-GCN的轻量级行为识别方法.pdf

    基于ST-GCN的轻量级行为识别方法.pdf

    开发板FPGA电机控制源码:底层Verilog与Nios II软件架构的协同工作,集成编码器模块算法与矢量调制等核心技术,开发板FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源

    开发板FPGA电机控制源码:底层Verilog与Nios II软件架构的协同工作,集成编码器模块算法与矢量调制等核心技术,开发板FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源码, 方案为单FPGA方案才用底层verilog + 应用层nios2的软件架构,很具有学习价值。 包括编码器模块算法, 坐标变算法, 矢量调制算法等等。 注:此代码不适合新手小白。 ,核心关键词:FPGA电机控制源码; 开发板; Verilog; Nios2架构; 编码器模块算法; 坐标变换算法; 矢量调制算法; 学习价值; 单FPGA方案; 底层Verilog + 应用层Nios2软件架构。,基于Verilog+Nios2架构的FPGA电机控制源码:单FPGA方案学习宝典

    产品经理-yyb.apk

    产品经理-yyb.apk

    基于PSO优化的SVM时间序列预测分析:详细代码注释,数据替换即用,PSO优化SVM做时间序列预测分析,代码内注释详细,直接替数据就可以使用 ,核心关键词:PSO优化; SVM; 时间序列预测分析;

    基于PSO优化的SVM时间序列预测分析:详细代码注释,数据替换即用,PSO优化SVM做时间序列预测分析,代码内注释详细,直接替数据就可以使用 ,核心关键词:PSO优化; SVM; 时间序列预测分析; 代码内注释详细; 直接替换数据即可使用。,PSO算法优化SVM时间序列预测分析工具——注释详尽的代码直接替换数据即可使用

    telepathy-glib-0.24.1-1.el7.x64-86.rpm.tar.gz

    1、文件内容:telepathy-glib-0.24.1-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/telepathy-glib-0.24.1-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    perl516-perl-DB_File-1.826-19.el6.centos.alt.x86_64.rpm

    perl516-perl-DB_File-1.826-19.el6.centos.alt.x86_64.rpm

    OMRON CP1HPLC电子手轮控制伺服:详细教程-接线、设定与编程指南,OMRON CP1HPLC 电子手轮控制伺服,如何接线,设定,编写程序 PDF文档,我自己总结编写的教程,实际项目应用

    OMRON CP1HPLC电子手轮控制伺服:详细教程——接线、设定与编程指南,OMRON CP1HPLC 电子手轮控制伺服,如何接线,设定,编写程序。 PDF文档,我自己总结编写的教程,实际项目应用,私家珍藏。 ,核心关键词:OMRON CP1HPLC; 电子手轮控制伺服; 接线方法; 设定步骤; 编写程序; 教程; PDF文档; 实际项目应用; 私家珍藏。,OMRON CP1HPLC伺服控制教程:接线、设定与编程指南

Global site tag (gtag.js) - Google Analytics