Java中資源加載的方法及Spring的ResourceLoader應(yīng)用小結(jié)
在Java開發(fā)中,資源加載是一個基礎(chǔ)而重要的操作。本文將深入探討Java中兩種常見的資源加載方式:ClassLoader的getResource方法和Class的getResource方法,并介紹Spring框架中的ResourceLoader的應(yīng)用。
1. 資源加載的兩種方式
1.1 ClassLoader的getResource方法
URL resourceFromClass = classLoader.getResource("demo.txt");ClassLoader的getResource方法是通過當(dāng)前類的ClassLoader實例來加載資源。路徑是相對于classpath的,可以輕松獲取單個資源。需要注意的是,路徑不要以"/"開頭,否則可能返回null。
1.2 Class的getResource方法
URL resourceFromClassWithPath = aClass.getResource("dir/demo.txt");Class的getResource方法通過當(dāng)前類來加載資源,路徑是相對于當(dāng)前類所在的包。如果資源名以"/"開頭,會以classpath為基準路徑加載資源。這種方式可以方便地獲取當(dāng)前類包內(nèi)的資源。
2. 獲取批量資源
Enumeration<URL> resources = classLoader.getResources("META-INF/MANIFEST.MF");通過ClassLoader的getResources方法,可以獲取指定路徑下的所有資源,返回一個Enumeration對象。這對于需要處理多個配置文件或元數(shù)據(jù)文件的場景非常有用。
3. Spring的ResourceLoader和ResourcePatternResolver
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] springResources = resolver.getResources("classpath:/spring/*.xml");Spring框架提供了ResourceLoader和ResourcePatternResolver接口,封裝了資源加載的方法。在上述代碼中,通過PathMatchingResourcePatternResolver實例,可以使用通配符獲取classpath下的所有xml文件。這對于加載多個配置文件非常方便。
4. 完整示例
package com.lfsun.resources;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
public class MyResource {
public static void main(String[] args) throws Exception {
// 獲取單個資源
// 獲取當(dāng)前類的Class對象
Class<MyResource> aClass = MyResource.class;
// 獲取當(dāng)前類的ClassLoader
ClassLoader classLoader = aClass.getClassLoader();
// 使用ClassLoader獲取資源,路徑相對于classpath
URL resourceFromClass = classLoader.getResource("demo.txt");
// 使用Class獲取資源,路徑相對于當(dāng)前類所在的包
URL resourceFromClassWithPath = aClass.getResource("dir/demo.txt");
// 輸出資源內(nèi)容
if (resourceFromClass != null) {
byte[] bytes = readBytesFromStream(resourceFromClass.openStream());
System.out.println("ClassLoader獲取的資源內(nèi)容: " + new String(bytes));
}
if (resourceFromClassWithPath != null) {
byte[] bytes = readBytesFromStream(resourceFromClassWithPath.openStream());
System.out.println("Class獲取的資源內(nèi)容: " + new String(bytes));
}
// 獲取批量資源
Enumeration<URL> resources = classLoader.getResources("META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) {
URL manifestResource = resources.nextElement();
System.out.println("Manifest資源: " + manifestResource);
}
// 使用Spring的ResourceLoader和ResourcePatternResolver
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 使用通配符獲取classpath下的所有xml文件
Resource[] springResources = resolver.getResources("classpath:/spring/*.xml");
// 輸出Spring資源內(nèi)容
for (Resource springResource : springResources) {
InputStream stream = springResource.getInputStream();
byte[] bytes = readBytesFromStream(stream);
System.out.println("Spring資源內(nèi)容: " + new String(bytes));
}
}
private static byte[] readBytesFromStream(InputStream stream) throws IOException {
StringBuilder buffer = new StringBuilder();
byte[] bytes = new byte[1024];
int bytesRead;
while ((bytesRead = stream.read(bytes)) != -1) {
buffer.append(new String(bytes, 0, bytesRead));
}
return buffer.toString().getBytes();
}
}輸出:
D:\Config\java-17\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2023.2.4\lib\idea_rt.jar=62858:D:\Program Files\JetBrains\IntelliJ IDEA 2023.2.4\bin" -Dfile.encoding=UTF-8 -classpath D:\Users\Administrator\IdeaProjects\lfsun-study-java17\lfsun-study-resources\target\classes;D:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\3.2.1\spring-boot-starter-3.2.1.jar;D:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\3.2.1\spring-boot-3.2.1.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-context\6.1.2\spring-context-6.1.2.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-aop\6.1.2\spring-aop-6.1.2.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-beans\6.1.2\spring-beans-6.1.2.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-expression\6.1.2\spring-expression-6.1.2.jar;D:\Users\Administrator\.m2\repository\io\micrometer\micrometer-observation\1.12.1\micrometer-observation-1.12.1.jar;D:\Users\Administrator\.m2\repository\io\micrometer\micrometer-commons\1.12.1\micrometer-commons-1.12.1.jar;D:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.2.1\spring-boot-autoconfigure-3.2.1.jar;D:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.2.1\spring-boot-starter-logging-3.2.1.jar;D:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.4.14\logback-classic-1.4.14.jar;D:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.4.14\logback-core-1.4.14.jar;D:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.21.1\log4j-to-slf4j-2.21.1.jar;D:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.21.1\log4j-api-2.21.1.jar;D:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\2.0.9\jul-to-slf4j-2.0.9.jar;D:\Users\Administrator\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-core\6.1.2\spring-core-6.1.2.jar;D:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\6.1.2\spring-jcl-6.1.2.jar;D:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\2.2\snakeyaml-2.2.jar;D:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\2.0.9\slf4j-api-2.0.9.jar com.lfsun.resources.MyResource
ClassLoader獲取的資源內(nèi)容: 這是 demo.txt 的內(nèi)容。Class獲取的資源內(nèi)容: 這是 dir/demo.txt 的內(nèi)容。
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/boot/spring-boot-starter/3.2.1/spring-boot-starter-3.2.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/boot/spring-boot/3.2.1/spring-boot-3.2.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-context/6.1.2/spring-context-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-aop/6.1.2/spring-aop-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-beans/6.1.2/spring-beans-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-expression/6.1.2/spring-expression-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/io/micrometer/micrometer-observation/1.12.1/micrometer-observation-1.12.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/io/micrometer/micrometer-commons/1.12.1/micrometer-commons-1.12.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.2.1/spring-boot-autoconfigure-3.2.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/boot/spring-boot-starter-logging/3.2.1/spring-boot-starter-logging-3.2.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/ch/qos/logback/logback-classic/1.4.14/logback-classic-1.4.14.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/ch/qos/logback/logback-core/1.4.14/logback-core-1.4.14.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.21.1/log4j-to-slf4j-2.21.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/apache/logging/log4j/log4j-api/2.21.1/log4j-api-2.21.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/slf4j/jul-to-slf4j/2.0.9/jul-to-slf4j-2.0.9.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-core/6.1.2/spring-core-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/springframework/spring-jcl/6.1.2/spring-jcl-6.1.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/yaml/snakeyaml/2.2/snakeyaml-2.2.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Users/Administrator/.m2/repository/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar!/META-INF/MANIFEST.MF
Manifest資源: jar:file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%202023.2.4/lib/idea_rt.jar!/META-INF/MANIFEST.MF
Spring資源內(nèi)容: <!-- config1.xml -->
<beans>
<bean id="bean1" class="com.lfsun.resources.entity.Bean1"/>
</beans>Spring資源內(nèi)容: <!-- config2.xml -->
<beans>
<bean id="bean2" class="com.lfsun.resources.entity.Bean2"/>
</beans>Process finished with exit code 0
代碼結(jié)構(gòu):

以上輸出演示了通過ClassLoader和Class獲取資源的內(nèi)容,以及使用Spring的ResourceLoader加載多個資源的過程。
到此這篇關(guān)于深入理解Java中資源加載的方法及Spring的ResourceLoader應(yīng)用的文章就介紹到這了,更多相關(guān)Java 資源加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springcloud feign調(diào)其他微服務(wù)時參數(shù)是對象的問題
這篇文章主要介紹了springcloud feign調(diào)其他微服務(wù)時參數(shù)是對象的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
編寫Spring MVC控制器的14個技巧(小結(jié))
這篇文章主要介紹了編寫Spring MVC控制器的14個技巧,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
springboot使用hibernate validator校驗方式
hibernate validator提供了一套比較完善、便捷的驗證實現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗方式,感興趣的朋友一起看看吧2018-01-01
mybatis之調(diào)用帶輸出參數(shù)的存儲過程(Oracle)
這篇文章主要介紹了mybatis調(diào)用帶輸出參數(shù)的存儲過程(Oracle),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
優(yōu)化SpringBoot程序啟動速度的實現(xiàn)
本文主要介紹了優(yōu)化SpringBoot程序啟動速度的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

