在应用spring@H_403_4@的工程中,使用class path@H_403_4@的方式加载配置文件应该是最常用的做法,然而对大部分人来说,刚开始使用Spring@H_403_4@时,几乎都碰到过加载配置文件失败的情况,除了配置上的错误外,很多时候是因为配置文件的路径和程序中指定的加载路径不一致,从而导致配置文件找不到,或是加载了错误地方的配置文件。本文将就Spring@H_403_4@如何从class path@H_403_4@中加载配置文件做一些简要的分析。
classpath:与classpath*:的区别在于,前者只会从第一个classpath中加载,而后者会从所有的classpath中加载
如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:前缀
另一种情况下,在多个classpath中存在同名资源,都需要加载,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀
可想而知,用classpath*:需要遍历所有的classpath,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*
情形一:使用classpath@H_403_4@加载且不含通配符
这是最简单的情形,Spring@H_403_4@默认会使用当前线程的ClassLoader@H_403_4@的getResource
方法获取资源的@H_403_4@
URL
,如果无法获得当前线程的@H_403_4@
ClassLoader
,@H_403_4@
Spring
将使用加载类@H_403_4@
org.springframework.util.ClassUtils@H_403_4@的@H_403_4@ClassLoader@H_403_4@。@H_403_4@
@H_403_4@
@H_403_4@
1.@H_403_4@当工程目录结构如图所示@H_403_4@:@H_403_4@
即配置文件放在@H_403_4@bin@H_403_4@目录中的@H_403_4@conf@H_403_4@文件夹里,这时使用@H_403_4@@H_403_4@
ApplicationContext context =@H_403_4@
new ClassPathXmlApplicationContext("conf/application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@将加载@H_403_4@bin/conf@H_403_4@目录下的@H_403_4@application-context.xml@H_403_4@文件。@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@@H_403_4@
Loading XML bean definitions from@H_403_4@
class path resource [conf/application-context.xml]@H_403_4@
@H_403_4@
ApplicationContext context =@H_403_4@
new ClassPathXmlApplicationContext("conf/application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@将加载@H_403_4@conf.jar@H_403_4@文件中@H_403_4@conf@H_403_4@目录下的@H_403_4@application-context.xml@H_403_4@文件。@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@@H_403_4@
Loading XML bean definitions from@H_403_4@
class path resource [conf/application-context.xml]@H_403_4@
@H_403_4@
@H_403_4@
ApplicationContext context =@H_403_4@
new ClassPathXmlApplicationContext("conf/application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,由于没有使用@H_403_4@classpath*@H_403_4@前缀,@H_403_4@Spring@H_403_4@只会加载一个@H_403_4@application-context.xml@H_403_4@文件。在@H_403_4@eclipse@H_403_4@中将会加载@H_403_4@bin/conf@H_403_4@目录下的@H_403_4@application-context.xml@H_403_4@文件,而@H_403_4@jar@H_403_4@包中的@H_403_4@conf/application-context.xml@H_403_4@并不会被加载,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@@H_403_4@
Loading XML bean definitions from@H_403_4@
情形二:使用@H_403_4@classpath@H_403_4@加载,包含通配符@H_403_4@
碰到通配符的情况时,@H_403_4@Spring@H_403_4@会通过使用路径中的非通配符部分先确定资源的大致位置,然后根据这个位置在确定具体的资源位置,结合下面给出的几种情况可以更好地理解@H_403_4@Spring@H_403_4@的这种工作方式@H_403_4@
@H_403_4@
即配置文件放在@H_403_4@bin@H_403_4@目录中的@H_403_4@conf@H_403_4@文件夹里,这时使用@H_403_4@
ApplicationContext context = new@H_403_4@
ClassPathXmlApplicationContext("conf/**/*application-context.xml");@H_403_4@
来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@首先会通过路径中的非通配符部分即@H_403_4@conf@H_403_4@,先确定@H_403_4@conf@H_403_4@的路径,即@H_403_4@bin/conf@H_403_4@目录,然后从该目录下加载配置文件,由于使用了@H_403_4@/**/@H_403_4@的方式,表明要加载@H_403_4@conf@H_403_4@目录下包括各级子目录中的所有配置文件,因此@H_403_4@bin/conf/application-context.xml@H_403_4@文件和@H_403_4@
bin/conf/admin/admin-application-context.xml@H_403_4@都会被加载,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@
Loading XML bean definitions from file@H_403_4@
[D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml]@H_403_4@
Loading XML bean definitions from file@H_403_4@
[D:\myworkspace\spring-study\bin\conf\application-context.xml]@H_403_4@
@H_403_4@
这时使用@H_403_4@
ApplicationContext context = new@H_403_4@
ClassPathXmlApplicationContext("conf/**/*application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@首先会通过路径中的非通配符部分即@H_403_4@conf@H_403_4@,先确定@H_403_4@conf@H_403_4@的路径,即@H_403_4@conf.jar@H_403_4@中的@H_403_4@conf@H_403_4@目录,然后从该目录下加载配置文件,由于使用了@H_403_4@/**/@H_403_4@的方式,表明要加载@H_403_4@conf@H_403_4@目录下包括各级子目录中的所有配置文件,因此@H_403_4@conf/application-context.xml@H_403_4@文件和@H_403_4@
conf/admin/admin-application-context.xml@H_403_4@都会被加载,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@
Loading XML bean definitions from class path resource@H_403_4@
[conf/admin/admin-application-context.xml]@H_403_4@
Loading XML bean definitions from class path resource@H_403_4@
[conf/application-context.xml]@H_403_4@
@H_403_4@
这时使用@H_403_4@
ApplicationContext context = new@H_403_4@
ClassPathXmlApplicationContext("conf/**/*application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@首先会通过路径中的非通配符部分即@H_403_4@conf@H_403_4@,先确定@H_403_4@conf@H_403_4@的路径,在@H_403_4@eclipse@H_403_4@中是@H_403_4@bin/conf@H_403_4@目录,然后从该目录下加载配置文件,由于使用了@H_403_4@/**/@H_403_4@的方式,表明要加载@H_403_4@conf@H_403_4@目录下包括各级子目录中的所有配置文件,因此@H_403_4@bin/conf/application-context.xml@H_403_4@文件和@H_403_4@
bin/conf/admin/admin-application-context.xml@H_403_4@都会被加载,但@H_403_4@conf.jar@H_403_4@文件中的配置文件并不会被加载,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@
Loading XML bean definitions from file@H_403_4@
[D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml]@H_403_4@
Loading XML bean definitions from file@H_403_4@
情形三:使用@H_403_4@classpath*@H_403_4@前缀且不包含通配符@H_403_4@
使用@H_403_4@classpath*@H_403_4@前缀可以获取所有与给定路径匹配的@H_403_4@classpath@H_403_4@资源,从而避免出现两个不同位置有相同名字的文件,@H_403_4@Spring@H_403_4@只加载其中一个的情况。@H_403_4@
这时使用@H_403_4@
ApplicationContext context = new@H_403_4@
ClassPathXmlApplicationContext("classpath*:conf/application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@将会加载@H_403_4@bin@H_403_4@目录下的@H_403_4@application-context.xml@H_403_4@文件和@H_403_4@jar@H_403_4@包里的@H_403_4@application-context.xml@H_403_4@文件,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@
Loading XML bean definitions from URL@H_403_4@
[file:/D:/myworkspace/spring-study/bin/conf/application-context.xml]@H_403_4@
Loading XML bean definitions from URL@H_403_4@
[jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]@H_403_4@
情形四:使用@H_403_4@classpath*@H_403_4@前缀,包含通配符@H_403_4@
@H_403_4@当工程目录结构如图所示:@H_403_4@
ApplicationContext context = new@H_403_4@
ClassPathXmlApplicationContext("classpath*:conf/**/*application-context.xml");@H_403_4@来创建@H_403_4@ApplicationContext@H_403_4@对象的话,@H_403_4@Spring@H_403_4@首先会通过路径中的非通配符部分即@H_403_4@conf@H_403_4@,先确定@H_403_4@conf@H_403_4@的路径,由于使用了@H_403_4@classpaht*@H_403_4@前缀,因此@H_403_4@bin@H_403_4@目录下的@H_403_4@conf@H_403_4@和@H_403_4@jar@H_403_4@包里的@H_403_4@conf@H_403_4@都会被加载,同时由于使用了@H_403_4@/**/@H_403_4@的方式,表明要加载@H_403_4@conf@H_403_4@目录下包括各级子目录中的所有配置文件,因此@H_403_4@bin/conf/application-context.xml@H_403_4@和@H_403_4@@H_403_4@
bin/conf/admin/admin-application-context.xml@H_403_4@以及@H_403_4@jar@H_403_4@包中的@H_403_4@@H_403_4@
conf/application-context.xml@H_403_4@和@H_403_4@@H_403_4@
conf/admin/admin-application-context.xml@H_403_4@都会被加载,@H_403_4@Spring@H_403_4@启动时的输出显示为:@H_403_4@@H_403_4@
Loading XML bean definitions from file@H_403_4@
[D:\myworkspace\spring-study\bin\conf\admin\admin-application-context.xml]@H_403_4@
Loading XML bean definitions from file@H_403_4@
[D:\myworkspace\spring-study\bin\conf\application-context.xml]@H_403_4@
Loading XML bean definitions from URL@H_403_4@
[jar:file:/D:/myworkspace/conf1.jar!/conf/admin/admin-application-context.xml]@H_403_4@
Loading XML bean definitions from URL@H_403_4@
[jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]@H_403_4@
@H_403_4@
@H_403_4@
@H_403_4@