Spring加载resource时classpath:
和 classpath*:
的区别
Spring可以通过指定classpath*:
与classpath:
前缀加路径的方式从classpath
加载文件;如bean的定义文件classpath*:
的出现是为了从多个jar文件中加载相同的文件;classpath:
只能加载找到的第一个文件.
1. java web项目中的classpath
1.1 classpath的含义:
classpath
是指 WEB-INF
文件夹下的classes
目录 ,对应为项目src
目录文件编译之后的文件夹。是一个定位资源的入口。
1.2 classpath中文件优先访问级别
lib
和classes
下文件访问优先级的问题: lib>classes
1.3 classpath:
和 classpath*:
区别
-
classpath:
只会到你的class路径中查找找文件;-
classpath的
查找范围应该是/WEB-INF/classes
,资源文件的缺省路径为src/main/resources
,Maven在打包成war文件的时候,会将src/main/resources
的资源文件复制到/WEB-INF/classes
目录。 - 如果要加载的资源, 不在当前ClassLoader的路径里,那么用
classpath:
前缀是找不到的, 这种情况下就需要使用classpath*:
前缀
-
-
classpath*:
不仅包含class路径,还包括jar文件中(class路径)进行查找,会从所有的calsspath
中加载。当项目中有多个classpath
路径,并同时加载多个classpath
路径下的文件,就发挥了作用,如果不加,则表示仅仅加载第一个classpath
路径。在多个
classpath
中存在同名资源,都需要加载, 那么用classpath:
只会加载第一个,这种情况下也需要用classpath*:
前缀注意:用
classpath*:
需要遍历所有的classpath
,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*
**/
:表示任意目录;**/applicationContext-*.xml
:表示任意目录下的以applicationContext-
开头的XML文件。
2. maven项目中的classpath
2.1 maven项目中对应的classpath
maven
项目分为src/main/java
目录、src/main/resources
目录,src/test/java
目录,/peis-src/test/resources
目录:
其中
src/main/java
目录、src/main/resources
目录对应到项目的target\classes
目录,如果在src/main
目录调用classpath
,则class
的根目录为target\classes
;src/test/java
目录,src/test/resources
目录对应到test-classes
目录,如果在src/test/java
目录调用classpath
,则class
的根目录为target\test-classes
;