getResource和getResources的区别_Emptor的博客-程序员宅基地

技术标签: spring  java  Spring Boot 源码  

getResource与getResources 都是【加载当前类加载器以及父类加载器所在路径的资源文件】
/**
 * 1.getResource
 * 加载当前类加载器以及父类加载器所在路径的资源文件
 * 将遇到的第一个资源文件直接返回!!!
 * 比如当前工程类路径有conf/demo.properties文件,引入的第三方jar包也有这个文件
 * 返回的是当前工程下的这个资源文件
**/
  URL url = loader.getResource("conf/demo.properties");      
/**
  * 2.getResources 
  * 加载当前类加载器以及父类加载器所在路径的资源文件
  * 将遇到的所有资源文件全部返回!
  * 比如当前工程类路径有conf/demo.properties文件,引入的第三方jar包也有这个文件
  * 则将这些文件全部返回
*/
Enumeration<URL> enumeration = loader.getResources("conf/demo.properties");
// 打印出所有同名的资源文件
while (enumeration.hasMoreElements()) {
	URL url1 = enumeration.nextElement();
	System.out.println("file=" + url1.getFile());
}

来个例子

新建一个spring boot项目,在resources目录下创建一个META-INF/spring.factories

在这里插入图片描述

pom.xml中引入的包. 其中很多包中都会有META-INF/spring.factories目录文件,在Spring boot 启动时,会加载所有这些jar包中的META-INF/spring.factories,从而进行必要类的初始化工作
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
测试类

下面展示一些 内联代码片


@SpringBootApplication
public class ResourceApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ResourceApplication.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        ClassLoader loader = ClassUtils.getDefaultClassLoader();
        URL url = loader.getResource("META-INF/spring.factories");
        System.out.println("Resource :" + url.getPath());
        System.out.println("=====================================");
        Enumeration<URL> enumeration = loader.getResources("META-INF/spring.factories");
        // 打印出所有同名的资源文件
        while (enumeration.hasMoreElements()) {
            URL url1 = enumeration.nextElement();
            System.out.println("Resources :" + url1.getFile());
        }
    }
}

在这里插入图片描述

由上面的输出可以看出,使用getResource时,只读取了当前模块resources下的MATE-INF/spring.factories文件。使用getResources,则读取到了所有依赖的包resources下的MATE-INF/spring.factories文件。

在这里插入图片描述

Spring Boot在启动时就使用到了这个,用来加载ApplicationContextInitializer实现类的初始化。

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30243515/article/details/106452362

智能推荐

Apache+Nginx配置ssl_nginx sslengine-程序员宅基地

Apache+Nginx配置ssl_nginx sslengine

jdk下载以前版本需要的账号(转)_jdk历史版本一定要登入吗-程序员宅基地

目前在官网下载低于jdk1.8的java jdk的时候需要登陆,这边分享一个账号,方便下载[email protected]密码:Oracle123注:请不要改密码,大家共同使用!!!..._jdk历史版本一定要登入吗

TCP协议四次挥手过程分析?为什么握手三次挥手四次?_为什么采用四报文握手-程序员宅基地

1. 为什么四次挥手?为什么连接的时候是三次握手,关闭的时候却是四次握手? 答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等..._为什么采用四报文握手

ACM:&nbsp;深搜&nbsp;poj&nbsp;2531&nbsp;&nbsp;(一开始,居然…-程序员宅基地

Network SaboteurDescriptionA university network is composed of N computers. Systemadministrators gathered information on the traffic between nodes,and carefully divided the network into two subnet

BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法_baseadapter notifydatasetchanged-程序员宅基地

前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notifyDataSetChanged()方法无效问题,当时在网上搜了一个解决方法,今天又遇到了一个类似的问题,我在这里做个记录,防止以后再次发生,或者其他朋友再次遇到。一、ScrollView中嵌套ListView或GridView原因:两个的滚动监听冲突解决方法:重写ListView或GridViewpackage com.m_baseadapter notifydatasetchanged

OpenGL ES之Android平台实现图形绘制一-程序员宅基地

OpenGl ES Java实现图形绘制项目地址https://github.com/rocky123shine/Rocky_Study_Open_GL_ES180310渲染器 RendererOpenGL提供的Renderer 是一个接口。该接口提供了监听Surface变化的三个方法。 1. onSurfaceCreated 2. onSurfaceChanged 3....

随便推点

RTIS#week1 格式化字符串漏洞总结_aaa0_%08x-程序员宅基地

0x01格式化字符串漏洞原理1、格式化字符串函数输入:scanf()输出: 函数 基本介绍 printf 输出到stdout fprintf 输出到指定FILE流 vprintf 根据参数列表格式化输出到 stdout vfprintf 根据参数列表格式化输出到指定FILE流 sprintf 输出到字符..._aaa0_%08x

java中可视化插件_JAVA可视化插件的使用_湖州太守的博客-程序员宅基地

一直做在安卓用xml作界面,对于Java的控件不熟悉,也不习惯用代码做UI尤其是布局。找了一下发现可以安装windowbuilder来实现java的可视化编程,但是很多资料里的连接都失效了。刚自己弄完比较熟悉,总结一下希望能帮到。我是直接在线安装的windowbuilder一.找到对应版本的windowbuilder打开这个链接:http://www.eclipse.org/windowbuild..._java可视化界面插件

关于调用TerminateProcess关闭其他进程的权限问题_terminateprocess 权限不足-程序员宅基地

首先提升本进程的权限 BOOL EnaleDebugPrivilege(){HANDLE hToken;BOOL fOk = FALSE;if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)){TOKEN_PRIVILEGES tp;tp.Pr_terminateprocess 权限不足

Windows异步IO (Asynchronous IO) (二)_asynchronous io 只有windows-程序员宅基地

前一篇文章我们知道如何向设备驱动发送异步IO请求。显然,仅仅知道这些肯定是不够的,用户线程必须在必要的时候收到设备驱动的完成通知(Completion Notification),以执行相关任务,不然异步IO没有任何意义。Windows提供四种方法来接受来自设备驱动的完成通知。 也许有朋友已经想到了一个方法。前一篇提到,我们可以通过Overlapped的Int_asynchronous io 只有windows

centos给用户添加sudo权限_centos 哟类似sudo-程序员宅基地

linux给用户添加sudo权限:有时候,linux下面运行sudo命令,会提示类似:xxxis not in the sudoers file. This incident will be reported.这里,xxx是用户名称,然后导致无法执行sudo命令,这时候,如下解决:进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。(当..._centos 哟类似sudo

Error:(4, 25) java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx-程序员宅基地

解决方法:用maven中的“clean”清理掉刚才打的jar包之后就不会报错了。