Mybatis源码分析

我们主要从下面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)接着调用configurationgetMapperClass<T> type,Sqlsession sqlSession方法

(3)再调用MapperRegistry中的getMapper(Class<T> type,Sqlsession sqlSession)方法

(4)接着通过MapperProxyFactory 工厂对象来获取 MapperProxy 在里面使用反射和动态代理的方式来获取最终的mapper对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值