获取resource路径下的配置文件getResourceA

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

这两天看着官方操作指南练习mybatis,遇到的第一个问题就是加载不到 mybatis-config.xml  

官网咋写咱咋写,然后就报错了 

嗯,我确定这个路径下有文件,相对路径和绝对路径的写法都是加载不到这个全局的配置文件。痛定思痛过后,我决定查查大家是怎么加载文件的,不用官网的方式。于是乎越查越乱,抽丝剥茧的整理了一下。

不管哪种加载文件的方式最终内部的实现方式都是基于Class或者ClassLoader的getResourceAsStream()进行获取的。首先看一下这两种方式是怎么获取的。

我的mybatis-config.xml在resource路径下,LoadConfigUtil是我的加载配置文件工具类

//获取方式一:通过ClassLoader方式
InputStream inputStream = LoadConfigUtil.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
//获取方式二:通过class方式
InputStream inputStream = LoadConfigUtil.class.getResourceAsStream("/mybatis-config.xml");
复制代码

两种方式都可以加载到resource路径下的mybatis-config.xml配置文件 ,写法上有些不同。

  • ClassLoader.getResource(String name)
    只能够从classpath根目录(maven构建项目时候resources目录是默认的classpath)
    开始匹配获取资源,写法classloader.getResource(“mybatis-config.xml”);

  • Class.getResource(String name)可以从当前Class所在包的路径开始匹配资源,写法Class.getResource("");也可以从classpath根路径开始获取资源,写法:Class.getResource("/mybatis-config.xml");

总结:选择ClassLoader加载的时候不要/ , Class加载文件的时候带/是从当前类所在的路径去开始匹配资源 。

尝试了把全局配置文件放在LoadConfigUtil包下的file文件夹下进行加载 ,代码如下

//获取方式二:通过class方式
InputStream inputStream = LoadConfigUtil.class.getResourceAsStream("file/mybatis-config.xml");
复制代码

日志显示加载不到全局配置文件,debug看到的加载路径是正确的错误信息显示读不到,去看了下target目录,发现编译后路径下没有我的全局配置文件mybatis-config.xml的,所以就一直加载不到哦。

这是Class加载文件流的源码,会发现如果当前Class为空的时候还是会用ClassLoader去加载

     public InputStream getResourceAsStream(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResourceAsStream(name);
        }
        return cl.getResourceAsStream(name);
    }
复制代码