http://www.blogjava.net/wangkai40/archive/2009/08/28/292927.html
Spring中使用classpath加载配置文件浅析 (如果您感觉可以请提出您宝贵的意见)
在应用Spring的工程中,使用class path的方式加载配置文件应该是最常用的做法,然而对大部分人来说,刚开始使用Spring时,几乎都碰到过加载配置文件失败的情况,除了配置上的错误外,很多时候是因为配置文件的路径和程序中指定的加载路径不一致,从而导致配置文件找不到,或是加载了错误地方的配置文件。本文将就Spring如何从class path中加载配置文件做一些简要的分析。
情形一:使用classpath加载且不含通配符 这是最简单的情形,Spring默认会使用当前线程的ClassLoader的getResource方法获取资源的URL,如果无法获得当前线程的ClassLoader,Spring将使用加载类org.springframework.util.ClassUtils的ClassLoader。
1.当工程目录结构如图所示: 即配置文件放在bin目录中的conf文件夹里,这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,Spring将加载bin/conf目录下的application-context.xml文件。Spring启动时的输出显示为: Loading XML bean definitions from class path resource [conf/application-context.xml] 2.当工程目录结构如图所示: 即bin目录下只有.class文件,没有配置文件,同时在工程属性的Java Build Path->Libraries里导入conf.ja
这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,Spring将加载conf.jar文件中conf目录下的application-context.xml文件。Spring启动时的输出显示为: Loading XML bean definitions from class path resource [conf/application-context.xml] 3. 当工程目录结构如图所示: 即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示: 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,由于没有使用classpath*前缀,Spring只会加载一个application-context.xml文件。在eclipse中将会加载bin/conf目录下的application-context.xml文件,而jar包中的conf/application-context.xml并不会被加载,Spring启动时的输出显示为: Loading XML bean definitions from class path resource [conf/application-context.xml] 情形二:使用classpath加载,包含通配符 碰到通配符的情况时,Spring会通过使用路径中的非通配符部分先确定资源的大致位置,然后根据这个位置在确定具体的资源位置,结合下面给出的几种情况可以更好地理解Spring的这种工作方式 1. 当工程目录结构如图所示: 即配置文件放在bin目录中的conf文件夹里,这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/**/*application-context.xml"); 来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,即bin/conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml文件和 bin/conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为: Loading XML bean definitions from file [D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml] Loading XML bean definitions from file [D:\myworkspace\spring-study\bin\conf\application-context.xml] 2.当工程目录结构如图所示: 即bin目录下只有.class文件,没有配置文件,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示: 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,即conf.jar中的conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此conf/application-context.xml文件和 conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为: Loading XML bean definitions from class path resource [conf/admin/admin-application-context.xml] Loading XML bean definitions from class path resource [conf/application-context.xml] 3.当工程目录结构如图所示: 即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示: 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,在eclipse中是bin/conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml文件和 bin/conf/admin/admin-application-context.xml都会被加载,但conf.jar文件中的配置文件并不会被加载,Spring启动时的输出显示为: Loading XML bean definitions from file [D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml] Loading XML bean definitions from file [D:\myworkspace\spring-study\bin\conf\application-context.xml] 情形三:使用classpath*前缀且不包含通配符 使用classpath*前缀可以获取所有与给定路径匹配的classpath资源,从而避免出现两个不同位置有相同名字的文件,Spring只加载其中一个的情况。 当工程目录结构如图所示: 即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示: 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:conf/application-context.xml");来创建ApplicationContext对象的话, Spring将会加载bin目录下的application-context.xml文件和jar包里的application-context.xml文件,Spring启动时的输出显示为: Loading XML bean definitions from URL [file:/D:/myworkspace/spring-study/bin/conf/application-context.xml] Loading XML bean definitions from URL [jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]
|
情形四:使用classpath*前缀,包含通配符
当工程目录结构如图所示:
即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:
这时使用
ApplicationContext context = new
ClassPathXmlApplicationContext("classpath*:conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,由于使用了classpaht*前缀,因此bin目录下的conf和jar包里的conf都会被加载,同时由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml和
bin/conf/admin/admin-application-context.xml以及jar包中的
conf/application-context.xml和
conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为:
Loading XML bean definitions from file
[D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml]
Loading XML bean definitions from file
[D:\myworkspace\spring-study\bin\conf\application-context.xml]
Loading XML bean definitions from URL
[jar:file:/D:/myworkspace/conf1.jar!/conf/admin/admin-application-context.xml]
Loading XML bean definitions from URL
[jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]
特别注意:
如果工程目录如图所示:
即配置文件直接放在bin目录中,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:
这时使用
ApplicationContext context = new
ClassPathXmlApplicationContext("classpath*:**/*application-context.xml");来创建ApplicationContext对象的话,Spring只会加载
bin/application-context.xml和bin/admin/admin-application-context.xml,
而jar包中的配置文件并不会被加载。这是因为Spring使用class path加载配置文件时需要借助JDK的ClassLoader.getResources(String name)方法,而该方法有一个局限:当传入的参数为空字符串时,即我们本意是想从根目录获取文件,这时JDK只会返回存在于文件系统中的资源,而在jar包中的资源并不会被返回。
我们在eclipse中写个简单的测试类就能很容易看到这点:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Enumeration resources = loader.getResources("");
while (resources.hasMoreElements()) {
URL url = (URL)resources.nextElement();
System.out.println(url);
}
运行测试类后,输出结果为:
file:/D:/myworkspace/spring-study/bin/
file:/D:/ProgramFiles/eclipse3.2/configuration/org.eclipse.osgi/bundles/47/1/.cp/
可以看到,获得的资源路径中并不包含jar包中的路径,因此jar包中的配置文件自然不能被Spring加载了。
相关推荐
通常我们使用这种写法是在 web.xml 中,例如 Spring 加载 bean 的上下文时。classpath: 只会到你的 class 路径中查找文件,不会包括 jar 文件中的 class 路径。 classpath*:是指不仅包含 class 路径,还包括 jar ...
项目资源包含:可运行源码+数据集+文档 python + numpy, pandas, matplotlib, pyecharts, wordcloud 适用人群:学习不同技术领域的小白或进阶学习者;可作为课程设计、大作业、工程实训或初期项目立项。 数据来源:数据集taxis.csv从网络下载 数据清洗:异常值与缺失值的处理:有一些数据distance(乘车距离)为零而且上下车地点为空,还有些一些数据的payment(支付方式)为空。 数据预处理:将列名更改成中文 标准化与归一化: 数据分析: 数据可视化:
TypeScript 入门教程
人脸识别项目实战
本资源汇总了 历届全国电子设计竞赛(电赛)真题+模拟题,涵盖 电路设计、嵌入式系统、信号处理、自动控制等核心考点,并提供详细解析及综合测评,帮助参赛者高效备赛、查漏补缺、提升实战能力。 适用人群: 适合 准备参加电子设计竞赛的大学生、电赛爱好者、电子信息类相关专业的学生,以及希望提高电子设计和电路分析能力的工程师。 能学到什么: 电赛考察重点:熟悉往届竞赛的命题方向及考核重点。 电路设计与仿真:提升模拟电路、数字电路、单片机等核心技能。 问题分析与解决能力:通过综合测评找到薄弱点并针对性提升。 实战经验:掌握竞赛策略,提高应试效率和设计能力。 阅读建议: 建议先 通读真题,了解题型与解题思路,然后 结合模拟题实战演练,查找不足并通过测评强化练习,逐步提升竞赛能力。
2024人工智能如何塑造未来产业:AI对各行业组织带来的的变革研究研究报告.pdf
人脸识别项目源码实战
给大家分享一套课程——Vulkan原理与实战课程
c语言学习
海豚鲸鱼数据集 5435张图 正确识别率可达92.6% 可识别:海豚 虎鲸 蜥蜴 海豹 鲨鱼 龟 支持yolov8格式标注
答谢中书书教学设计.docx
人脸识别项目源码实战
c语言学习
人脸识别项目源码实战
人脸识别项目实战
本美发门店管理系统有管理员和用户两个角色。用户功能有项目预定管理,产品购买管理,会员充值管理,余额查询管理。管理员功能有个人中心,用户管理,美容项目管理,项目类型管理,项目预定管理,产品库存管理,产品购买管理,产品入库管理,会员卡管理,会员充值管理,余额查询管理,产品类型管理,系统管理等。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得美发门店管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高美发门店管理系统管理效率。 关键词:美发门店管理系统;SSM框架;MYSQL数据库;Spring Boot 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1 MYSQL数据库 2 2.2 B/S结构 3 2.3 Spring Boot框架简介 4 3系统分析 4 3.1可行性分析 4 3.1.1技术可行性 4 3.1.2经济可行性 5 3.1.3操作可行性 5 3.2系
内容概要:本文档介绍了基于SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据分类预测的详细项目实例,重点讲述了该项目的背景、目标、挑战与解决方案、技术特点、应用领域等方面的内容。文档详细记录了从项目启动、数据预处理、算法设计(SSA优化CNN-GRU模型)、构建与评估模型到实现美观的GUI界面整个过程,并讨论了防止过拟合的技术如正则化、早停和超参数优化。另外还涵盖了项目扩展的可能性、部署和应用策略、需要注意的地方以及未来改进的方向。全文强调了模型的泛化能力和计算效率,展示了该混合算法模型在实际应用中的优越性能。 适合人群:具备一定的Python编程经验及机器学习基础知识的研究人员和技术人员;对深度学习、智能优化算法及实际应用感兴趣的学者和从业者;寻求提升数据分析和预测准确性的金融分析师、数据科学家等相关专业人士。 使用场景及目标:本文档非常适合用作学习和参考资料,以掌握如何将SSA、CNN与GRU三种先进技术结合起来进行复杂的分类和预测问题求解。具体应用场景包括但不限于以下几个方面:金融领域——股票价格预测;医疗保健领域——辅助诊断;工业制造——预防性维护;智能家居——个性化服务;以及其他涉及到时序数据分析和多模态数据处理的场合。文档既包含了理论知识又提供了完整的源代码示例,可以帮助读者理解算法原理并通过实践中加深对其的认识。 其他说明:该项目不仅仅是关于算法的设计实现,更是有关于系统的整体架构规划以及工程上的考量,比如环境准备(确保环境洁净、必要包的安装等)、数据准备、GPU配置支持等等。同时文中给出了详细的代码片段,方便开发者理解和复现实验成果。值得注意的是,虽然文中提供了一套通用解决方案,但在真实场景下还需要针对性的调整参数或修改网络结构来达到最好的性能效果。此外,对于追求更高的预测精度或解决更大规模的问题,作者建议进一步探索深度强化学习等高级技术和多任务学习策略,并且考虑使用增量学习让模型能够适应新数据而不必重新训练整个模型。最后提到安全性和隐私保护也是项目实施过程中的重要因素,要妥善保管用户的敏感信息并且做到合法合规地收集和使用数据。
人脸识别项目实战
人脸识别项目实战