簡體   English   中英

類加載器如何找到資源?

[英]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”目錄

  • 我認為這種模式與依賴注入和單元測試有關。 此特定模式有名稱嗎? 在哪里可以了解更多信息?

編輯:調整問題以專注於ClassLoadergetResource功能,而不是依賴項注入

這與依賴注入無關,但與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM