spring classpath:和classpath*:區別和實際應用
阿新 • • 發佈:2018-11-08
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"/>
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
檔案引入B
和C
的順序決定哪個工程的class
被載入,換句話說,jar
包的引入順序決定了class
的載入權 - 場景三:
A、B、C
的spring-application.xml
中配置了不同的Bean
,那麼三個工程的配置檔案都會被載入
總結: classpath
只會在第一個載入的類路徑下查詢,如果沒有,查詢當前類路徑下的jar
檔案中的配置檔案,找到停止,否則繼續找下個jar
檔案中的配置檔案,直到找到,否則拋異常
案例二:
前提:
工程A
和B
,B
為公共模組,設計了公共的客戶端類Client
,A
引入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.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 |