classpath*: 和classpath:有什么区别_源码分析spring加载resource classpath和classpath*的区别...

 你今天微笑了吗?嘿嘿  516ad38c6f35e706c18dff96965cc918.png

7f6452f272230e15375f9284b393971b.png

最近遇到一个问题:在一个基于maven构建的使用springboot和Mybatis-Plus整合的一个多组件项目,其中在组件A中application.yml文件中配置了Mybatis-Plus配置项mapper-locations如下:
mybatis-plus:  mapper-locations: classpath:mapper/**/*.xml
项目中组件依赖关系是:组件A依赖组件B和C,组件B和C中都有满足上述配置项的mapper xml文件,但是发现启动组件A后只加载了组件B和C其一下的mapper文件(具体加载哪个是以在组件A的pom文件中配置的对组件B、C的dependency的先后顺序为准,先配置的被加载),未被加载的在使用的时候会报错:org.apache.ibatis.binding.BindingException:Invalid bound statement (not found)。 在网上找了解决办法:把classpath改成classpath*,改后试了一下确实OK了,然后又找几篇文章看了一下spring在加载classpath和classpath*路径下的文件有什么区别,几篇文章只讲了结论,有的说法还不一,看完感觉只知其然而不知其所以然,所以决定自己看源码学习一下,也简单总结了一下,分享给有同样需求的小伙伴 f484103effbffb161216a4a5c5f329fe.png 先从项目Mybatis-Plus该配置项入手,我们知道springboot的yml配置文件中的每项配置都有其对应的属性文件,找到Mybatis-plus相关属性配置文件如下:这里只复制了和配置项相关的代码
MybatisPlusProperties.java:@ConfigurationProperties(prefix = "mybatis-plus")public class MybatisPlusProperties {
        private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();    ......        public Resource[] resolveMapperLocations() {
            return Stream.of(Optional.ofNullable(this.mapperLocations).orElse(new String[0]))            .flatMap(location -> Stream.of(getResources(location)))            .toArray(Resource[]::new);    }    private Resource[] getResources(String location) {
            try {
                return resourceResolver.getResources(location);        } catch (IOException e) {
                return new Resource[0];        }    } }

我们看到实质加载资源文件就是通过PathMatchingResourcePatternResolver类的getResources方法加载的,PathMatchingResourcePatternResolver类是spring-core模块的一个类,所以我们这里单独搭建一个spring项目测试一下看一下源码,项目工程结构如下:

7f21c475e1b951afc2d9d1019429f64f.png

b8d0a4eb96716d4716e91edaafdfbb86.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值