Mybatis中注册和获取mapper(动态代理)

1.在configuration中构建mapperRegistry对象,扫描mapper包,以mappper.class作为参数构造MapperProxyFactory

2.注册MapperProxyFactory到MapperRegistry中的Map, MapperProxyFactory> knownMappers

3.从mapperRegistry中getMapper(sqlsession中调用)

Mybatis中注册和获取mapper(动态代理)_第1张图片

从knownMappers获取MapperProxyFactory 

4.调用MapperProxyFactory.newInstance获得mapper返回

#1 绑定target到代理类(sqlsession才是真实代理对象(最后方法还是到它里面来执行),下文的代理对象指的是proxy代理对象)


#2 构造并且返回代理对象


Mybatis中注册和获取mapper(动态代理)_第2张图片

5. 当代理对象mapper调用相应的数据库操作方法时,调用代理对象的invoke方法


Mybatis中注册和获取mapper(动态代理)_第3张图片

代理对象对真实执行方法进行了优化缓存,缓存到了MapperMethod类中,每个方法被调用的时候,会调用代理类的cachedMapperMethod方法获取MapperMethod对象,如果是第一次调用方法,则会构造MapperMethod对象,并且缓存到代理对象中的private final Map methodCache中;(单例模式)

6. 数据库操作方法的真实执行 真实代理发生在mapperMethod.execute(sqlSession,args);

接下来让我们看一下MapperMethod类  属性和构造方法


Mybatis中注册和获取mapper(动态代理)_第4张图片

分为两部分(内部类),SQL命令(对应mapperXML文件中的