Mapper代理類的生成過程
在MyBatis中我們是通過SqlSession.getMapper(SomeInstance.class)方法獲取對應的Mapper代理類。Mapper的代理類是如何生成的呢纽甘?下面看一下Mapper代理類的生成過程肮韧。 生成Mapper代理的邏輯主要在binding包下锐想,如上圖所示塑崖。
????從上圖中可以看到binding包目錄下主要有BindingException,MapperMethod痛倚,MapperProxy规婆,MapperProxyFactory,MapperRegistry這五個類蝉稳。其中最簡單的就是BindingException類了抒蚜,BindingException為自定義異常類,在binding包下拋出的異常都由BindingException類封裝了一層耘戚。其它幾個類之間相互協(xié)作嗡髓,使得SqlSession在每次獲取指定Mapper類時,都能生成一個新的Mapper代理類收津。下面我們先看一下這幾個類之間是怎么相互協(xié)作的饿这。
????1浊伙、?首先是代理的生成過程
???? 2、代理類被調(diào)用的過程长捧,調(diào)用請求會走到MapperProxy類中的invoke方法嚣鄙,invoke方法中封裝了對MapperMethod類的execute方法的調(diào)用。MapperMethod類的execute方法作為一個入口串结,后面會走Mybatis的主要SQL執(zhí)行邏輯哑子,最終返回執(zhí)行結(jié)果。
下面看一下這幾個類主要的作用
???? MapperRegistry類主要提供了兩個功能肌割,第一個是addMapper方法卧蜓,在Configuration類解析xml文件時,每當解析到mapper相關(guān)的包或者類把敞,都會調(diào)用addMapper方法弥奸,將mapper添加到MapperRegistry維護的mapper緩存中。
???? 第二個是getMapper方法奋早,調(diào)用getMapper(Class<T> type,SqlSession sqlSession)方法會生成指定Mapper的代理類盛霎。
???? MapperProxyFactory類從名字中就可以看出來,該類是生成Mapper代理類的工廠類伸蚯,對外提供了newInstance(SqlSession sqlSession)方法。通過調(diào)用newInstance方法简烤,就可以生成指定的代理類了剂邮。
????MapperProxy類實現(xiàn)了JDK動態(tài)代理的InvocationHandler接口類,重寫了invoke方法横侦,MapperProxyFactory類在生成代理類時挥萌,會將已封裝好的MapperProxy類作為參數(shù)生成代理類。
???? MapperMethod類主要的方法是execute(SqlSession sqlSession, Object[] args)方法枉侧,該方法可以看作是一個入口引瀑。