我们知道通过初始化了SqlSessionFactory之后可以实例化出一个默认的DefaultSqlSessionFactory。那么通过这个全局唯一的单利工厂,可以生成我们每次需要使用的sqlsession会话实例
源码分析如下:
1我们知道sqlSessionFactory接口有以下方法
2而mybatis默认实现类是DefaultSqlSessionFactory,接下去看一下这个实现类的真面目
3 4这里简单说一下,mybatis的三种执行器类型
ExecutorType 枚举类
SIMPLE:简易执行器,不配置就采用这种
REUSE:一种执行器重用预处理语句
BATCH:执行器重用语句和批量更新,专门针对批量专用的执行器
mybatis会根据执行器类型去初始化不同的执行器Executor。后面会说明Executor在mybatis执行过程中的作用是什么。
继续往下看
5 6 7简要分析:
1:通过从环境中获取到其中的事物工厂,并通过该事物工厂每次都new一个事物。
2:通过执行器类型初始化不同的执行器
3:初始化DefaultSqlSession
获取到sqlsession之后,就是调用sqlsession的getMapper方法去获取到映射器的实例。
下面重点分析 sqlSession.getMapper(Class class)
8再继续向下看,找到Configuration.getMapper(type, sqlsession);
9 10 11 12 13下面重点分析这个方法:
1:简单分析一下,通过映射器的Class type去knownMappers这个HashMap中找到对应的MapperProxyFactory实例
2:通过MapperProxyFactory去获取一个映射器的代理类 mapperProxyFactory.newInstance(sqlsession);
13该方法分两步:
1:首先 new 一个MapperProxy实例出来,这个实例是做什么的呢?继续查看MapperProxy的源码
2:将该MapperProxy实例作为一个handler去调用Proxy的newProxyInstance方法。真正生成该映射器的代理类$Proxy0。
14原来这个MapperProxy实例就是一个InvocationHandler,通过jdk动态代理会生成一个该映射器的代理类,并在代理类的构造函数中将该handler初始化传入,最终在这个UserMapper映射器的代理类上执行一系列方法时,会最终执行该handler的invoke方法,
网友评论