classpath:和classpath*:的含義


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文件中的配置文件,直到找到,否則拋異常

 

針對多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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM