1. 程式人生 > >spring classpath:和classpath*:區別和實際應用

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"/>
	resources/spring/spring-application.xml

B:resources/spring/spring-application.xml

C:resources/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中配置了不同的Bean,那麼三個工程的配置檔案都會被載入

總結: classpath只會在第一個載入的類路徑下查詢,如果沒有,查詢當前類路徑下的jar檔案中的配置檔案,找到停止,否則繼續找下個jar

檔案中的配置檔案,直到找到,否則拋異常

案例二:

前提:
工程ABB為公共模組,設計了公共的客戶端類ClientA引入B,兩個工程都有resources/spring資源目錄,此目錄下有配置檔案spring-client.xml,分別配置了一個Client Bean,偽配置如下:

A:

	resources/spring/spring-environment.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
		<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>

結論: 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