繁体   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