mybatis源码分析 二、Resources以及ClassLoader的使用

本文分析了MyBatis中Resources类如何加载全局配置文件mybatis-config.xml,涉及ClassLoader的使用,特别是classLoaderWrapper对ClassLoader的封装,以及ClassLoader在加载资源文件中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis源码分析 二、Resources以及ClassLoader的使用

  1. 当我们使用使用mybtis的时候,可以发现我们第一步做的事情就是使用resouce去加载我们的全局配置文件。下面是使用mybatis的一段测试代码。

    public static void main(String[] args) throws IOException {
        //读取 mybatis-config.xml 文件转成输入流
        Reader resourceAsReader = Resources.getResourceAsReader("org/apache/ibatis/dao/mapper/mybatis-config.xml");

        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession sqlSession = build.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = mapper.selectById("0954693eb7ebaa0b693d3c787fb8bab7");
        System.out.println(map);
    }

我们首先使用的就是Resources 类里面的**Resources.getResourceAsReader()**方法读取我们的全局配置文件mybatis-config.xml,接下来我带大家看看Resources 的源码。

  public static Properties getResourceAsProperties(String resource) throws IOException {
    Properties props = new Properties();
    InputStream in = getResourceAsStream(resource);
    props.load(in);
    in.close();
    return props;
  }
  public static InputStream getResourceAsStream(String resource) throws IOException {
    return getResourceAsStream(null, resource);
  }

这两个方法是resource的核心方法,可以看到返回值是不同的,一个是将文件的信息读取成流进行返回,另一个是返回的Properties对象。其实转成Properties的那个方法也是先调用了getResourceAsStream先将数据转成流然后再封装成Properties对象。所以执行流程基本一致。

  public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
    InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
    if (in == null) {
      throw new IOException("Could not find resource " + resource);
    }
    return in;
  }

最有都是由 classLoaderWrapper.getResourceAsStream(resource, loader)转成的流。所以其实Resources类最终使用的还是classLoaderWrapper。classLoaderWrapper是mybatis io包中针对classLoader的一个包装器。主要就是对classLoader的使用进行的封装。

在这里插入图片描述

可以看到ClassLoaderWrapper内置了两个的Classloader对象。一个是默认加载器(defaultClassLoader)和系统加载器(systemClassLoader)。

calssLoader是类加载器,calssLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确的运行了。mybatis中使用到classLoader的作用主要是用来加载资源。

在这里插入图片描述

这个就是他mybatis使用classLoader的核心方法。使用calssLoader的getResourceAsStream方法。主要作用就是根据路径去读取我们文件的信息然后转换成流。

其实Resource类的主要作用就是读取我们配置文件的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久★伴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值