classpath与classpath*实现逻辑

136 阅读1分钟

前言

在spring项目中经常会出现classpath与classpath*的配置,我们知道classpath指会加载当前项目下的配置,classpath*会加载当前项目和依赖项目中的配置

今天我们来看一下底层代码,看看是如何实现的

先看结论

底层采用的是类加载器的方法来实现classLoader.getResources()加载所有指定名称的文件,classLoader.getResource()只加载当前项目下的指定文件,classLoader.getResourceAsStream()获取当前项目下配置文件的输入流。

在底层就要看java源代码了,这里不过分追究。

image.png

扩展点

首先我们要知道classpath与classpath*起作用的点在哪里。

当spring进行beanDefinition注册的时候,有一个resources属性,这个属性是一个数组,里面包含了很多个Resource,循环对这些Resource进行处理,会通过Resource获取配置文件的输入流,然后注册beanDefinition,然后根据beanDefinition来创建bean。

classpath与classpath*的区别就在于获取Resource对象的这一步。

代码截图

我们拿ClassPathXmlApplicationContext来举例

ClassPathXmlApplicationContext context = new MyXmlApplication("classpath:application.xml");

这里会判断是否以classpath*为前缀

image.png

前缀为classpath

image.png

image.png

image.png

获取输入流的具体实现 image.png

前缀为classpath*

image.png

image.png