問題
1.四大對(duì)象什么時(shí)候被代理讥邻,也就是:代理對(duì)象是什么時(shí)候創(chuàng)建的?
我們都知道允許被代理的對(duì)象就是我們常說的四大天王
那具體代理對(duì)象啥時(shí)候創(chuàng)建呢豹爹?Executor 是 openSession() 的 時(shí) 候 創(chuàng) 建 的 ; StatementHandler 是SimpleExecutor.doQuery()創(chuàng)建的;里面包含了處理參數(shù)的 ParameterHandler 和處理結(jié)果集的 ResultSetHandler 的創(chuàng)建佃乘,創(chuàng)建之后即調(diào)用 InterceptorChain.pluginAll(),返回層層代理后的對(duì)象。
2.多個(gè)插件的情況下,代理能不能被代理?代理順序和調(diào)用順序的關(guān)系?
3.誰來創(chuàng)建代理對(duì)象?
Plugin 類喧锦。在我們重寫的 plugin()方法里面可以直接調(diào)用 return Plugin.wrap(target, this);返回代理對(duì)象。
4.被代理后抓督,調(diào)用的是什么方法?怎么調(diào)用到原被代理對(duì)象的方法?
因?yàn)榇眍愂?Plugin燃少,所以最后調(diào)用的是 Plugin 的 invoke()方法。它先調(diào)用了定義的攔截器的 intercept()方法铃在≌缶撸可以通過 invocation.proceed()調(diào)用到被代理對(duì)象被攔截的方法。
總結(jié)流程:
插件中對(duì)象總結(jié):
5.插件編寫與注冊(cè)
1)編寫自己的插件類:1.實(shí)現(xiàn) Interceptor 接口這個(gè)是所有的插件必須實(shí)現(xiàn)的接口定铜。2.添加@Intercepts({@Signature()})怔昨,指定攔截的對(duì)象和方法、方法參數(shù)方法名稱+參數(shù)類型宿稀,構(gòu)成了方法的簽名,決定了能夠攔截到哪個(gè)方法赖捌。3.實(shí)現(xiàn)接口的 3 個(gè)方法
2)插件注冊(cè)祝沸,在 mybatis-config.xml 中注冊(cè)插件:
3)插件登記:MyBatis 啟動(dòng)時(shí)掃描<plugins>標(biāo)簽,注冊(cè)到 Configuration 對(duì)象的InterceptorChain 中越庇。property 里面的參數(shù)罩锐,會(huì)調(diào)用 setProperties()方法處理。