MyBatis之启动分析(一)
前言
方法重载最终实现处理的方法源码如下:
public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { // 实例化 XMLConfigBuilder,用于读取配置文件信息 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); // 解析配置信息,保存到 Configuration 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. } } }
- environment 是指定加载环境,默认值为 null。
- properties 是属性配置文件,默认值为 null。
同时读取配置文件既可字符流读取,也支持字节流读取。
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } }
实例化 XMLConfigBuilder 类
通过 SqlSessionFactoryBuilder 中 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties)
, 分析 XMLConfigBuilder实例化过程。
该类中有四个变量:
private boolean parsed; private final XPathParser parser; private String environment; private final ReflectorFactory localReflectorFactory = new DefaultReflectorFactory();
- parsed 是否解析,一次解析即可。用于标志配置文件只解析一次,
true
为已解析过。 - parser 解析配置的解析器
- environment 加载环境,即
SqlSessionFactoryBuilder
中的environment
- localReflectorFactory 用于创建和缓存
Reflector
对象,一个类对应一个Reflector
。因为参数处理、结果映射等操作时,会涉及大量的反射操作。DefaultReflectorFactory
实现类比较简单,这里不再进行讲解。
XMLConfigBuilder构建函数实现:
public XMLConfigBuilder(Reader reader, String environment, Properties props) { this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props); }