聊聊Mybatis的初始化之建造者模式

聊聊Mybatis的初始化之建造者模式

Mybatis首先会加载和解析全局配置文件,调用SqlSessionFactoryBuilder.build() 方法

构建SqlSession工厂类

SqlSessionFactoryBuilder.build() 方法:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {    try {      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);      return build(parser.parse());    } catch (Exception e) {      throw ExceptionFactory.wrapException("Error building SqlSession.", e);    } finally {      ErrorContext.instance().reset();      try {        reader.close();      } catch (IOException e) {        // Intentionally ignore. Prefer previous error.      }    }  }  public SqlSessionFactory build(Configuration config) {    return new DefaultSqlSessionFactory(config);  }
  1. 构造XMLConfigBuilder对象,
  2. 调用parser.parse()方法进行xml文件的解析,返回Configuration对象,配置文件的全部配置信息都保存在Configuration对象中
  3. 调用build()方法生成DefaultSqlSessionFactory对象返回

解析xml文件

下面看一下XMLConfigBuilder的parse()方法:

public Configuration parse() {    if (parsed) {      throw new BuilderException("Each XMLConfigBuilder can only be used once.");    }    parsed = true;    parseConfiguration(parser.evalNode("/configuration"));    return configuration;  }  private void parseConfiguration(XNode root) {    try {      // issue #117 read properties first      propertiesElement(root.evalNode("properties"));      Properties settings = settingsAsProperties(root.evalNode("settings"));      loadCustomVfs(settings);      loadCustomLogImpl(settings);      typeAliasesElement(root.evalNode("typeAliases"));      pluginElement(root.evalNode("plugins"));      objectFactoryElement(root.evalNode("objectFactory"));      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));      reflectorFactoryElement(root.evalNode("reflectorFactory"));      settingsElement(settings);      // read it after objectFactory and objectWrapperFactory issue #631      environmentsElement(root.evalNode("environments"));      databaseIdProviderElement(root.evalNode("databaseIdProvider"));      typeHandlerElement(root.evalNode("typeHandlers"));      mapperElement(root.evalNode("mappers"));    } catch (Exception e) {      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);    }  }

解析xml中的properties标签,这个标签一般定义连接数据库的url 驱动 用户名密码等等,KV形式,保存在Properties类的对象中

解析xml中的settings标签,这个标签是mybatis的全局性配置,比如开启二级缓存,懒加载等,保存在Properties类中

解析xml中的typeAliases标签,这个标签用于设置类的别名,记录到TypeAliasRegistry对象

解析xml中的typeHandler标签,这个标签用于设置类型转换器,类型转换器就是实现java和jdbc之间的类型转换,记录在TypeHandlerRegistry中

解析xml中的plugins标签,这个标签可以在执行过程中的某一点进行拦截调用,自定义类实现Interceptor接口就可以,保存在Configuration对象

解析xml中的对象工厂objectFactory标签,这个标签可以用来配置自定义的对象工厂,使用的时候继承Mybatis的DefaultObjectFactory类,在创建结果对象实例的时候会被调用,这个解析了也是保存在Configuration对象中

解析xml中的对象包装工厂objectWrapperFactory标签

解析xml中的创建和缓存Reflector对象的reflectorFactory标签,可以自定义工厂类继承DefaultReflectorFactory类

解析xml中的environments标签,这个标签用来配置不同的环境,包括transactionManager事务管理器标签和dataSource数据源标签

解析xml中的databaseIdProvider标签,这个标签是数据库厂商的标识,解析的标签保存了DatabaseIdProvider对象中,调用getDatabaseId()获取databaseId来确定数据库厂商

解析mappers标签,mappers标签想必大家都比较熟悉了,就是对应xml文件

总结

本篇主要介绍了Mybatis解析全局配置文件的标签的内容,采用了建造模式通过各种Xml文件的解析来构建Configuration对象,最终创建出SqlSessionFactory工厂类,思想值得借鉴。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章