- 浏览: 20303 次
- 性别:
- 来自: 苏州
-
最新评论
在应用Spring的工程中,使用class path的方式加载配置文件应该是最常用的做法,然而对大部分人来说,刚开始使用Spring时,几乎都碰到过加载配置文件失败的情况,除了配置上的错误外,很多时候是因为配置文件的路径和程序中指定的加载路径不一致,从而导致配置文件找不到,或是加载了错误地方的配置文件。本文将就Spring如何从class path中加载配置文件做一些简要的分析。
情形一:使用classpath加载且不含通配符 这是最简单的情形,Spring默认会使用当前线程的ClassLoader的
1.当工程目录结构如图所示: ![]() 即配置文件放在bin目录中的conf文件夹里,这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/application-context.xml");
Loading XML bean definitions from class path resource [conf/application-context.xml]
2.当工程目录结构如图所示:
![]() 即bin目录下只有.class文件,没有配置文件,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:
![]() 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("conf/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");
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");
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");
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");
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] 来创建ApplicationContext对象的话, Spring将会加载bin目录下的application-context.xml文件和jar包里的application-context.xml文件,Spring启动时的输出显示为: |
情形四:使用classpath*前缀,包含通配符 当工程目录结构如图所示: ![]() 即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:
![]() 这时使用 ApplicationContext context = new ClassPathXmlApplicationContext("classpath*: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");
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加载了。
来创建ApplicationContext对象的话,Spring只会加载 |
发表评论
-
java src for mac pro
2011-08-13 16:00 9471. 从connect.apple.com下载java d ... -
做大的艺术 - 大型网站的架构设计
2009-11-03 14:37 866如果说1980年代是PC的时 ... -
项目中你不得不知的11个Java第三方类库
2009-11-02 13:22 760项目中你不得不知的11个Java第三方类库 ... -
把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试回顾
2009-10-22 13:18 1352把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试 ... -
正则表达式高级技巧基本概念实例详解[译]
2009-06-05 23:04 688原文作者:Karthik Viswanathan原文链接:Cr ... -
大道至简-Java之23种模式一点就通
2009-04-16 22:15 644FACTORY—人才市场:以往 ... -
Dom4j的使用(全而好的文章)
2009-04-14 13:20 649Dom4j的使用(全而好的文章) 关键字: dom4 ... -
各大型网站架构分析收集收藏
2009-02-08 21:50 9511. PlentyOfFish 网站架构学 ... -
Log4j基本使用方法
2008-12-28 21:48 790Log4j由三个重要的组 ... -
Log4j中文使用手册
2008-12-28 21:46 4729Copyright© 2000-20 ...
相关推荐
主要介绍了Spring配置中的"classpath:"与"classpath*:"的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Spring中ApplicationContext加载机制 ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供...
NULL 博文链接:https://huangminwen.iteye.com/blog/1486843
主要介绍了spring boot加载资源路径配置和classpath问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在 web.xml 文件中配置 ContextLoaderListener 和 contextConfigLocation,以便加载 Spring 的配置文件。 ```xml <!-- Spring 配置 --> org.springframework.web.context.ContextLoaderListener ...
使用 PropertyPlaceholderConfigurer 需要首先在 Spring 配置文件中定义一个 bean,例如: ```xml <bean id="propertyConfigurerForAnalysis" class="org.springframework.beans.factory.config....
(1) spring-core.jar 这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 (2) spring-beans.jar 这个...
将classpath路径下的配置文件加载进properties集合,并实现Student接口,多态形式,提高程序的可维护性
本文详细叙述了.classpath中各种属性的含义
在xml配置文件中,这样加载properties文件 <bean id="propertyConfigurer" class="com.better517na.propertiesComponent.business.ExtendedPropertyPlaceholderConfigurer"> <value>classpath:...
详细讲解了java classpath 的详细过程,让你不在为配置java环境而烦恼,讲的非常好!word格式的!
<description>Spring公共配置文件 <!-- mes 的數據庫 --> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> ...
web应用程序通过Tomcat等容器启动时,会首先加载web.xml文件,通常我们工程中的各种配置文件,如日志、数据库、spring的文件等都在此时被加载,下面是两种常用的配置文件加载路径,即配置文件可以放到 SRC目录下或者...
NULL 博文链接:https://hahalzb.iteye.com/blog/690802
要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。
logback框架会默认加载classpath下命名为logback-spring.xml或logback.xml的配置文件。 如果将所有日志都存储在一个文件中,文件大小也随着应用的运行越来越大并且不好排查问题,正确的做法应该是将error日志和其他...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
关于java的classpath补充,详细说明如何配置classpath,如火热让javac正确编译运行java文件