classpath与classpath*实现逻辑

前言

在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()
相关推荐
没带西川地图的张永年11 分钟前
springboot加载配置文件几种方式
后端
镜花水月linyi13 分钟前
执行SELECT/INSERT/UPDATE/DELETE的SQL语句,MySQL流程是怎么样的?
后端·mysql
狂奔小菜鸡13 分钟前
Day33 | Java中的Optional
java·后端·java ee
天若有情67318 分钟前
我发明的PROTO_V4协议:一个让数据“穿上迷彩服”的发明(整数传输协议)
网络·c++·后端·安全·密码学·密码·数据
游浪踏23 分钟前
003_AI Agent(模拟实现)
后端·agent
PieroPC26 分钟前
nicegui 3.4.0 + sqlite3 做一个简单维修登记系统
后端
用户75438886771527 分钟前
HarmonyOS BLE 快速上手
后端
禅思院34 分钟前
在win10上配置 Rust以及修改默认位置问题
开发语言·前端·后端·rust·cargo·mingw64·cargo安装位置
2501_9167665439 分钟前
【SpringMVC】异常处理和拦截器
java·spring
武子康1 小时前
大数据-188 Logstash Output 插件实战:stdout/file/Elasticsearch 输出配置与调优
大数据·后端·logstash