spring classpath:和classpath*:区别和实际应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring classpath:和classpath*:区别和实际应用相关的知识,希望对你有一定的参考价值。
参考技术A 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,此文件中配置
场景一: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 文件
# resources/spring/spring-client.xml 配置文件
1
2
3
4
5
6
7
B:
# resources/spring/spring-common.xml 配置文件引入的 spring-client.xml ,这个配置文件会引入A工程的,不会引入自己的
# resources/spring/spring-client.xml 配置文件
1
2
3
4
5
6
7
结论: 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
————————————————
原文链接:https://blog.csdn.net/qq_30038111/article/details/82116559
在web.xml中classpath和classpath*的区别
classpath 和 classpath* 区别: classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. 举个简单的例子,在我的web.xml中是这么定义的:classpath*:META-INF/spring/application-context.xml 那么在META-INF/spring这个文件夹底下的所有application-context.xml都会被加载到上下文中,这些包括META-INF/spring文件夹底下的 application-context.xml,META-INF/spring的子文件夹的application-context.xml以及jar中的application-context.xml。 如果我在web.xml中定义的是:classpath:META-INF/spring/application-context.xml 那么只有META-INF/spring底下的application-context.xml会被加载到上下文中。
以上是关于spring classpath:和classpath*:区别和实际应用的主要内容,如果未能解决你的问题,请参考以下文章
为 .java 源文件定位对应的 .classpath 文件
Spring Spring配置文件中classpath和classpath*的区别