【mybatis框架学习】四、动态代理类的工厂类及核心纽带
工厂类也是一个很常见的设计模式,隐藏细节,包装流程,所以动态代理对应的定义一个工厂类也很正常。
工厂类的工作一向很简单,得到mapper接口类之后,再传给实际的动态代理类进行初始化即可,针对Proxy的方法调用也被写在这里
methodCache的作用我们需要结合动态代理类MapperProxy来了解
MapperProxy内部就开始知识点激增了,学习过程就得只关注核心内容
上面看到是工厂类将内部的methodCache传入到MapperProxy的构造函数的,实际上可以理解为MapperProxy的实例的某些内容被放到methodCache里面缓存起来了,方便复用
当MapperProxy的invoke方法被调用时,我们直接关注cacheInvoker方法的调用,它通过访问methodCache尝试返回一个可被复用的MapperMethodInvoker接口的实例
mapper接口类、当前要调用的方法描述信息Method和sqlsession中的configuration(先忽略它是干嘛的)被用来初始化MapperMethod
MapperMethod又被用于初始化PlainMethodInvoker
PlainMethodInvoker才是MapperMethodInvoker接口的实际实现类
最终PlainMethodInvoker的invoke方法被调用,一切调用被传递到MapperMethod的execute方法,此时的入参只有sqlSession实例,和方法调用入参
我们可以看到,工厂类、代理类、内部接口、内部接口实现类,全部都服务于MapperMethod,它才是mybatis将sql语句执行,与mapper接口调用关联起来的核心纽带
在时间的巨兽面前,我们只有卑微与无奈的成长