[英]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.