Mybatis源码学习(二):核心对象分析(一)

前言

在上一篇文章中我们大致的了解了Mybatis的使用方法以及核心对象。本文将对前文提到的核心对象进行源码分析。

一、Configuration

完整路径:org.apache.ibatis.session.Configuration,顾名思义Configuration这个类是对我们配置文件的封装。我们所编写的XML最终会被Myabtis解析并分装成Configuration对象。下面我们摘取部分源码进行分析

public class Configuration {
    //环境
    protected Environment environment;
    //参数
    protected Properties variables = new Properties();
    //Mapper注册器
    protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
    //拦截器链
    protected final InterceptorChain interceptorChain = new InterceptorChain();
    //类型处理注册器
    protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry(this);
    //别名注册器
    protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
    .....
}

Configuration中有非常多的属性,例如:
1、Environment(环境):Myabtis是支持多环境的,例如dev、test、product环境;不同的环境可以配置不同的数据源、事务工厂。但是在现在的实际中这一属性基本不太会用,因为现在的多环境是交由Spring来管理。
2、Properties(属性):Mybatis允许用户引入外部配置文件,该参数映射到Mybatis配置文件中节点。用法如下:
image.png
image.png
3、MapperRegistry:该类存储了我们所编写的Mapper文件(通过解析xxxMapper.xml来封装);采用HashMap来存储。
image.png
4、InterceptorChain(拦截器链):InterceptorChain定义了一些列的拦截器用于做一些增强,我们使用的Mybatis-Plus中的分页插件就是使用拦截器来实现的。
image.png

二、Configuration什么时候被实例化

这里的实例化指的是Mybatis什么时候把我们编写的Xml文件封装成Configuration这个对象。这就要回到我们最早的如何使用Mybatis的代码中去了。在Java IO的体系中如果想要读取一个文件的内容我们需要通过InputsStream(输入流)来实现。

public class Application {

    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        //读取mybatis配置文件并获取输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //构建SqlSessionFactory(重点!!)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //方式一:
        try (SqlSession session = sqlSessionFactory.openSession()) {
            PersonMapper mapper = session.getMapper(PersonMapper.class);
            List<Person> personList = mapper.selectAll();
        }
    }
}

在该Demo中当我们拿到了输入流之后,接着会去构建一个SqlSessionFactory对象,这就是我们研究的重点代码,进入方法。
image.png
可以看到Mybatis拿到输入流之后会去解析咱们的mybatis-config.xml这个配置文件,并返回一个名为XMLConfigBuilder对象。同时构建一个SqlSessionFactory对象需要Configuration对象,而刚好parser.parse()方法就返回了该对象,继续Debug,进入XMLConfigBuilder中。不难看出这些节点都是和我们配置文件一一对应的。

  private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      //解析properties节点
      propertiesElement(root.evalNode("properties"));
      //解析settings节点
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      //后面的解析代码省略...
         
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

(补充:Myabtis会将节点分装成XNode对象,采用XPathParser来解析)

三、小结

1、Myabtis解析Xml并生成Configuration对象核心的流程图。
image.png

2、在本小结中我们学习了Myabtis是如何将Xml解析成为Configuration对象的
(1)获取输入流
(2)通过输入流创建XmlConfigBuilder(建造者设计模式)
(3)通过XmlConfigBuilder来解析Xml(用到XPathParser来解析,并将每个节点封装成XNode)
(4)解析所有节点并返回Configuration对象
至此我们已经清楚了Mybatis是如何将Xml解析为Configuration对象的,下一篇文章会讲述其他核心对象是如何使用以及如何被实例化的。希望对你有所帮助

未完待续

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值