[英]How does the classloader find resources?
我正在審查一個小型github示例項目( shagie / TestingWithHsqldb ),偶然發現了一個對我來說是新的約定,希望有人可以幫助我了解我在看什么。
該項目在src主目錄下組織,例如...
src/main/resources/connection_config.properties
src/main/java/com/shagie/dbtest/db/DBConnection.java
src/main/java/com/shagie/dbtest/db/DataAccess.java
src/test/resources/connection_config.properties
src/test/java/com/shagie/dbtest/db/DataAccessTest.java
DBConnection.java
的代碼既可以從“主”目錄下的DataAccess.java
調用,也可以從“測試”目錄中的DataAccessTest.java
中調用。
在文件DBConnection.java
有以下語句可導入connection_config.properties
文件:
Properties prop = new Properties();
InputStream in = GetClass().getResourceAsStream("/connection_config.properties");
prop.load(in);
in.close();
我的問題...
如果調用的結構為getResourceAsStream("/connection_config.properties")
如何在“資源”目錄中找到屬性文件? 該路徑是否意味着它應該查看屬性文件的根目錄(主目錄或測試目錄)?
由於DBConnection.java
不會更改其根目錄“ main”,因此執行DataAccessTest.java
時屬性文件如何來自“ test”目錄
我認為這種模式與依賴注入和單元測試有關。
此特定模式有名稱嗎?
在哪里可以了解更多信息?
編輯:調整問題以專注於ClassLoader
的getResource
功能,而不是依賴項注入
這與依賴注入無關,但與ClassLoader
解析資源路徑的方式有關。
1)這可能有點令人困惑,因為Linux背景確實使getResourceAsStream(resource)
具有不同的規則。 根據文檔 :
如果名稱以'/'('\\ u002f')開頭,則資源的絕對名稱是名稱中'/'之后的部分。
因此,這里的前導斜線僅告訴類加載器如何獲取絕對名稱(通過的名稱是否應該以軟件包名稱開頭),而不是它應該在“根目錄”中查找(在test / main中)文件夾)。 根源是什么,解析的工作方式取決於您使用的類加載器。 默認情況下(在這種情況下)在resources
文件夾中搜索resources
。 您可以編寫自己的ClassLoader
並更改該行為。
2)同樣,當調用getResources()
或getResourceAsStream()
,類將其委托給ClassLoader
了該類的ClassLoader
。 如果您正在運行單元測試(Junit或類似的東西),那么ClassLoader
會知道它應該在test
文件夾(不是main
尋找資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.