前言
在spring项目中经常会出现classpath与classpath*
的配置,我们知道classpath
指会加载当前项目下的配置,classpath*
会加载当前项目和依赖项目中的配置
今天我们来看一下底层代码,看看是如何实现的
作用
首先我们要知道classpath与classpath*
起作用的点在哪里,当spring进行beanDefiniti注册的时候,会通过Resource对象获取配置文件的输入流。
classpath与classpath*
的作用就在于创建Resource对象的时候,如果使用classpath
那么只会加载当前项目下的指定的配置文件,如果使用classpath*
那么会加载当前和所依赖的项目下的指定的配置文件。
所以我们找一下创建Resource对象和同过Resourc对象获取输入流的代码,就可以知道其作用与原理了。
代码截图
我们拿ClassPathXmlApplicationContext
来举例
java
ClassPathXmlApplicationContext context = new MyXmlApplication("classpath:application.xml");
这里会判断是否以classpath*
为前缀
前缀为classpath
获取输入流的具体实现
前缀为classpath*
总结
以classpath*
为前缀时会通过classloader.getResources()
方法获取项目下的所有符合名称的配置文件,转换为UrlResource
对象。
以classpath
为前缀时会将路径封装成一个ClassPathResource
对象,在获取输入流时使用classLoader.getResourceAsStream()
获取当前项目下的配置文件的输入流
知识点在于以下几个方法
java
classLoader.getResourceAsStream()
classLoader.getResources()
classLoader.getResource()