聊聊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);
}
- 构造XMLConfigBuilder对象,
- 调用parser.parse()方法进行xml文件的解析,返回Configuration对象,配置文件的全部配置信息都保存在Configuration对象中
- 调用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)