前言
在spring项目中经常会出现classpath与classpath*的配置,我们知道classpath指会加载当前项目下的配置,classpath*会加载当前项目和依赖项目中的配置
今天我们来看一下底层代码,看看是如何实现的
先看结论
底层采用的是类加载器的方法来实现classLoader.getResources()加载所有指定名称的文件,classLoader.getResource()只加载当前项目下的指定文件,classLoader.getResourceAsStream()获取当前项目下配置文件的输入流。
在底层就要看java源代码了,这里不过分追究。
扩展点
首先我们要知道classpath与classpath*起作用的点在哪里。
当spring进行beanDefinition注册的时候,有一个resources属性,这个属性是一个数组,里面包含了很多个Resource,循环对这些Resource进行处理,会通过Resource获取配置文件的输入流,然后注册beanDefinition,然后根据beanDefinition来创建bean。
classpath与classpath*的区别就在于获取Resource对象的这一步。
代码截图
我们拿ClassPathXmlApplicationContext来举例
ClassPathXmlApplicationContext context = new MyXmlApplication("classpath:application.xml");
这里会判断是否以classpath*为前缀
前缀为classpath
获取输入流的具体实现