MyBatis的版本是: 3.5.4-SNAPSHOT
断点看从sqlSession中获取mapper对象。
我们知道,MyBatis使用的Java动态代理为接口(UserMapper)生成代理类。
简单说下:我们加载MaBatis的xml配置文件和Mapper文件,会生成一个 configuration 对象。这里对象里面有一个
MapperRegistry类型对象(这个对象就是存储我们的Mapper.xml中的nameSpace对应的接口所对用的MapperProxyFactory对象。比如我这个:UserMapper 接口。)
这个MapperRegistry类的 getMapper 方法:第一个参数就是我们要被代理的接口(比如我的UserMapper 接口) ,第二个参数是sqlSession。逻辑很简单,先从Map对象 knownMappers 中获取到该接口UserMapper 对应的MapperProxyFactory类型的对象mapperProxyFactory。
然后mapperProxyFactory对象是什么呢?
查看源码:MapperProxyFactory类是我们的MapperProxy类的工厂类,再查看MapperProxy的源码。
public class MapperProxy<T> implements InvocationHandler, Serializable
看到没,实现了InvocationHandler接口。学过java动态代理的都知道,实现这个接口的类,需要重写invoke方法,而这个invoke方法就是对应的代理类到时候的执行逻辑。继续看我们之前的从MapperProxyFactory工厂里获取对象mapperProxy的方法:先我们初始化一个实现了InvocationHandler接口的类 MapperProxy,然后使用JAVA动态代理为我们的接口UserMapper生成代理类
protected T newInstance(MapperProxy<T> mapperProxy) {
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession