spring classpath:和classpath*:区别和实际应用

classpath:classpath*:的含义

classpath: :表示从类路径中加载资源,classpath:classpath:/是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在JARZIP的类包中。
classpath*::假设多个JAR包或文件系统类路径都有一个相同的配置文件,classpath:只会在第一个加载的类路径下查找,而classpath*:会扫描所有这些JAR包及类路径下出现的同名文件

classpath:只会在第一个加载的类路径下查找?

怎么去理解这句话?我根据我的实验结果来解释这个问题。
案例一:

前提:
工程A引入BC,三个工程都有配置文件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文件引入BC的顺序决定哪个工程的class被加载,换句话说,jar包的引入顺序决定了class的加载权
  • 场景三:A、B、Cspring-application.xml中配置了不同的class,那么三个工程的配置文件都会被加载,此时要注意避免三个配置文件中都配置相同的class,否则会抛异常

总结: classpath只会在第一个加载的类路径下查找,如果没有,查找当前类路径下的jar文件中的配置文件,找到停止,否则继续找下个jar文件中的配置文件,直到找到,否则抛异常

案例二:

前提:
工程ABB为公共模块,设计了公共的客户端类ClientA引入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.xmlspring-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.URLjava.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
  • 18
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值