MyBatis源码解析2-MapperRegistry

MapperProxy只会在mapper(dao)的方法被调用的时候,才会去调用invoke() 方法
发现MapperProxy#nvoke(Object proxy, Method method, Object[] args)每次都会被调用


MapperRegistry只会在SpringBoot应用启动的过程中会调用addMapper()和getMapper()方法,
在mapper方法被用户调用的时候,并不会去调用addMapper和geMapper这两个方法。

getMapper()会执行Proxy.newProxyInstance(); 产生一个proxyClass的对象

newProxyInstance会维持一个二级缓存, k,p, v

k:classLoader
p: interfaces[]
v: ProxyClass (例如$Proxy0, $Proxy1)

注意:这里缓存的是代理类 class,而不是对象
一般的个体M apper() 获取到的对象的类名比如为$Proxy55 是代理类的生成的对象。

关于MapperFactoryBean

MyBatis源码解析2-MapperRegistry_第1张图片
估计siSingleton== true的里面的getBean()只会被调用一次。

public boolean isSingleton() :该方法返回结果用于表明,getObject()创建的对象是否要以singleton(单例)形式存于容器中。如果以singleton形式存在,则返回true,否则返回false
说明isSingleton return true的时候, Spring容器会把这个bean以单例等形式注册到Baen容器中去.也就是这个getBean()方法只会被调用一次。 第二次直接从Spring容器中读取缓存即可

连载列表
MyBatis源码解析1-全局熟悉源码

MyBatis源码解析2-MapperRegistry

MyBatis源码解析3-MapperFactoryBean

你可能感兴趣的:(源码解析)