MyBatis源码解析(一)——MyBatis初始化过程解析

1 通过classLoader获取配置文件(mybatis-config.xml)的输入流,字符流,最终转化为Document,XPathParser,封装为 XMLConfigBuilder 对象.
2 解析过程:
  • XMLxxxBuilder是用来解析XML配置文件的,不同类型XMLxxxBuilder用来解析MyBatis配置文件的不同部位。比如:XMLConfigBuilder用来解析MyBatis的配置文件,XMLMapperBuilder用来解析MyBatis中的映射文件(如上文提到的ProductMapper.xml),XMLStatementBuilder用来解析映射文件中的SQL语句。
  • 这些XMLxxxBuilder都有一个共同的父类——BaseBuilder。这个父类维护了一个全局的Configuration对象,MyBatis的配置文件解析后就以Configuration对象的形式存储。
  • 当创建XMLConfigBuilder对象时,就会初始化Configuration对象,并且在初始化Configuration对象的时候,一些别名会被注册到ConfigurationtypeAliasRegistry容器中。

private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration());
ErrorContext.instance().resource("SQL Mapper Configuration");
this.configuration.setVariables(props);
this.parsed = false;
this.environment = environment;
this.parser = parser;
}
public Configuration() {
typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);
typeAliasRegistry.registerAlias("FIFO", FifoCache.class);
typeAliasRegistry.registerAlias("LRU", LruCache.class);
typeAliasRegistry.registerAlias("SOFT", SoftCache.class);
typeAliasRegistry.registerAlias("WEAK", WeakCache.class);
……
}

3 把配置文件解析成 一个包含了映射文件解析结果的 configuration 对象,紧接着,这个对象将作为参数传递给另一个build函数,如下:
public SqlSessionFactory build (Configuration config) {
return new DefaultSqlSessionFactory(config);
}
这个函数将 configuration 作为参数,创建了 DefaultSqlSessionFactory 对象。 
DefaultSqlSessionFactory 是接口 SqlSessionFactory 的一个实现类, SqlSessionFactory 的体系结构如下图所示

猜你喜欢

转载自blog.csdn.net/asdasdasd123123123/article/details/80947307