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 |