classpath:
和classpath*:
的含义
classpath:
:表示从类路径中加载资源,classpath:
和classpath:/
是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在JAR
或ZIP
的类包中。
classpath*:
:假设多个JAR
包或文件系统类路径都有一个相同的配置文件,classpath:
只会在第一个加载的类路径下查找,而classpath*:
会扫描所有这些JAR
包及类路径下出现的同名文件。
classpath:
只会在第一个加载的类路径下查找?
怎么去理解这句话?我根据我的实验结果来解释这个问题。
案例一:
前提:
工程A
引入B
和C
,三个工程都有配置文件resources/spring/spring-application.xml
,其中A
有配置文件resources/spring/spring-environment.xml
,此文件中配置<import resource="classpath:/spring/spring-application.xml"/>
- 场景一:
A、B、C
工程有同包同名的class
,分别配置在各自的spring-application.xml
中,A
工程的bean
被加载 - 场景二:
B、C
工程有同包同名的class
,分别配置在各自的spring-application.xml
中,A
工程POM
文件引入B
和C
的顺序决定哪个工程的class
被加载,换句话说,jar
包的引入顺序决定了class
的加载权 - 场景三:
A、B、C
的spring-application.xml
中配置了不同的class
,那么三个工程的配置文件都会被加载,此时要注意避免三个配置文件中都配置相同的class
,否则会抛异常
总结: classpath
只会在第一个加载的类路径下查找,如果没有,查找当前类路径下的jar
文件中的配置文件,找到停止,否则继续找下个jar
文件中的配置文件,直到找到,否则抛异常
案例二:
前提:
工程A
和B
,B
为公共模块,设计了公共的客户端类Client
,A
引入B
,两个工程都有配置文件spring-client.xml
,分别配置了一个Client Bean
,
A:
# resources/spring/spring-environment.xml 配置文件引入B工程的 spring-common.xml 文件
<import resource="classpath:/spring/spring-common.xml"/>
# resources/spring/spring-client.xml 配置文件
<bean id="b" class="com.p7.common.Client">
<constructor-arg name="name" value="Main project" />
</bean>
B:
# resources/spring/spring-common.xml 配置文件引入的 spring-client.xml ,这个配置文件会引入A工程的,不会引入自己的
<import resource="classpath:/spring/spring-client.xml"/>
# resources/spring/spring-client.xml 配置文件
<bean id="b" class="com.p7.common.Client">
<constructor-arg name="name" value="Common project" />
</bean>
结论: B工程spring-common.xml
配置文件import spring-client.xml
,spring-client.xml
在A和B工程中都存在,A引入B的spring-common.xml
配置文件,A工程的spring-client.xml
生效
针对多module
工程的建议
我们上面的案例中提到多个工程有同包的工程结构,而实际的module
设计中,建议不同的module
使用不同的包名,避免引起不必要的麻烦。
拓展
Spring
设计了一个Resource
接口,该接口拥有对应不同资源类型的实现类,例如:
ClassPathResource
类路径下的资源,资源以相对于类路径的方式表示FileSystemResource
文件系统资源,资源以文件系统路径的方式表示,如D:/conf/bean.xml
InputStreamResource
ServletContextResource
UrlResource
封装了java.net.URL
,能够访问任何可以通过URL表示的资源,如文件系统资源、HTTP
资源、FTP
资源PathResource
封装了java.net.URL
、java.nio.file.path
地址前缀 | 示例 | 对应的资源类型 |
---|---|---|
classpath: | classpath:/spring/spring-*.xml | 从类路径中加载资源,classpath:和classpath:/是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在JAR或ZIP的类包中 |
file: | file:/conf/bean.xml | 使用UrlResource从文件系统目录中装载资源,可采用绝对或相对路径 |
http:// | http://www.p7.com/resource/bean.xml | 使用URLResource从Web服务器中装载资源 |
ftp:// | ftp://www.p7.com/resource/bean.xml | 使用URLResource从FTP服务器中装载资源 |
没有前缀 | conf/bean.xml | 根据ApplicationContext的具体实现采用对应类型的Resource |