Java中資源加載的方法及Spring的ResourceLoader應(yīng)用小結(jié)
在Java開發(fā)中,資源加載是一個(gè)基礎(chǔ)而重要的操作。本文將深入探討Java中兩種常見的資源加載方式:ClassLoader的getResource方法和Class的getResource方法,并介紹Spring框架中的ResourceLoader的應(yīng)用。
1. 資源加載的兩種方式
1.1 ClassLoader的getResource方法
URL resourceFromClass = classLoader.getResource("demo.txt");
ClassLoader
的getResource
方法是通過(guò)當(dāng)前類的ClassLoader
實(shí)例來(lái)加載資源。路徑是相對(duì)于classpath的,可以輕松獲取單個(gè)資源。需要注意的是,路徑不要以"/"開頭,否則可能返回null。
1.2 Class的getResource方法
URL resourceFromClassWithPath = aClass.getResource("dir/demo.txt");
Class
的getResource
方法通過(guò)當(dāng)前類來(lái)加載資源,路徑是相對(duì)于當(dāng)前類所在的包。如果資源名以"/"開頭,會(huì)以classpath為基準(zhǔn)路徑加載資源。這種方式可以方便地獲取當(dāng)前類包內(nèi)的資源。
2. 獲取批量資源
Enumeration<URL> resources = classLoader.getResources("META-INF/MANIFEST.MF");
通過(guò)ClassLoader
的getResources
方法,可以獲取指定路徑下的所有資源,返回一個(gè)Enumeration
對(duì)象。這對(duì)于需要處理多個(gè)配置文件或元數(shù)據(jù)文件的場(chǎng)景非常有用。
3. Spring的ResourceLoader和ResourcePatternResolver
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] springResources = resolver.getResources("classpath:/spring/*.xml");
Spring框架提供了ResourceLoader
和ResourcePatternResolver
接口,封裝了資源加載的方法。在上述代碼中,通過(guò)PathMatchingResourcePatternResolver
實(shí)例,可以使用通配符獲取classpath下的所有xml文件。這對(duì)于加載多個(gè)配置文件非常方便。
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 { // 獲取單個(gè)資源 // 獲取當(dāng)前類的Class對(duì)象 Class<MyResource> aClass = MyResource.class; // 獲取當(dāng)前類的ClassLoader ClassLoader classLoader = aClass.getClassLoader(); // 使用ClassLoader獲取資源,路徑相對(duì)于classpath URL resourceFromClass = classLoader.getResource("demo.txt"); // 使用Class獲取資源,路徑相對(duì)于當(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):
以上輸出演示了通過(guò)ClassLoader和Class獲取資源的內(nèi)容,以及使用Spring的ResourceLoader加載多個(gè)資源的過(guò)程。
到此這篇關(guān)于深入理解Java中資源加載的方法及Spring的ResourceLoader應(yīng)用的文章就介紹到這了,更多相關(guān)Java 資源加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法
這篇文章主要介紹了java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04springcloud feign調(diào)其他微服務(wù)時(shí)參數(shù)是對(duì)象的問(wèn)題
這篇文章主要介紹了springcloud feign調(diào)其他微服務(wù)時(shí)參數(shù)是對(duì)象的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03編寫Spring MVC控制器的14個(gè)技巧(小結(jié))
這篇文章主要介紹了編寫Spring MVC控制器的14個(gè)技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11springboot使用hibernate validator校驗(yàn)方式
hibernate validator提供了一套比較完善、便捷的驗(yàn)證實(shí)現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗(yàn)方式,感興趣的朋友一起看看吧2018-01-01java: 錯(cuò)誤: 無(wú)效的源發(fā)行版18問(wèn)題及解決
這篇文章主要介紹了java: 錯(cuò)誤: 無(wú)效的源發(fā)行版18問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04mybatis之調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程(Oracle)
這篇文章主要介紹了mybatis調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程(Oracle),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11優(yōu)化SpringBoot程序啟動(dòng)速度的實(shí)現(xiàn)
本文主要介紹了優(yōu)化SpringBoot程序啟動(dòng)速度的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01