我们主要从下面4行代码来对Mybatis的底层源码进行分析
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=factory.openSession();
ClassMapper mapper=session.getMapper(ClassMapper.class);
1.获取XML文件的输入流
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
该部分流程图
(1)首先Rescources 源调用getResources(String resources)加载配置文件
(2)再调用的过程中发现调用了类的加载器getResourceAsStream(classLoader loader,String resources)
(3)在调用加载器的过程中发现调用的是classLoaderWrapper中getResourceAsStream(String rescource,ClassLoader classLoader)里面的数组getResourceAsStream(String resource,ClassLoader[] classLoader)
数组中还有ClassLoaderWrappper中成员变量默认的类加载器,当前对象的类加载器以及系统类加载器,五个类加载器
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
return new ClassLoader[]{
classLoader,
defaultClassLoader,
Thread.currentThread().getContextClassLoader(),
getClass().getClassLoader(),
systemClassLoader};
}
(4)最后通过对该数组进行判断,看类加载器中所读的流是否为null,如果不为null,则返回InputStream对象
2.获取SqlSessionFactory对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
该部分流程图
(1)通过创建SqlsessionFactoryBuilder对象获取sqlsessionfactory 对象
(2)创建完之后调用 build(InputStream inputStream)方法,接着调用build(InputStream inputStream, String environment, Properties properties)方法
(3)构建parser创建Xpath解析去解析mybatis-config.xml文件
(4)解析的文件内容套接到configuration中 而这个configuration 相当于 mybatis-config.xml 中的配置文件所对应的类。
(5)最后返回DefaultSqlSessionFactory对象
3.获取SqlSession对象
SqlSession session=factory.openSession();
该部分流程图
(1) 通过DefaultSqlSessionFactory对象调用它里面opensession方法返回DefaultSQLSession对象
(2)调用的是openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)
该方法下有三个参数 第一个执行器的类型 第二个 事务的隔离级别 第三个 是否自动提交
(3)声明一个事务的对象,通过配置文件去读取环境标签的信息,然后通过环境去获取事务工厂对象
(4)创建相应的执行器newExcutor()
(5)返回 DefaultSqlSession对象。
4.获取mapper
ClassMapper mapper=session.getMapper(ClassMapper.class);
该部分流程图
(1)调用efauitDsqlsession中getMapper方法
(2)接着调用configuration的getMapper(Class<T> type,Sqlsession sqlSession)方法
(3)再调用MapperRegistry中的getMapper(Class<T> type,Sqlsession sqlSession)方法
(4)接着通过MapperProxyFactory 工厂对象来获取 MapperProxy 在里面使用反射和动态代理的方式来获取最终的mapper对象。