多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > 框架設(shè)計 > 深入淺出Mybatis-插件原理

深入淺出Mybatis-插件原理

來源:程序員人生   發(fā)布時間:2017-02-03 14:52:59 閱讀次數(shù):4091次

Mybatis采取責(zé)任鏈模式,通過動態(tài)代理組織多個攔截器(插件),通過這些攔截器可以改變Mybatis的默許行動(諸如SQL重寫之類的),由于插件會深入到Mybatis的核心,因此在編寫自己的插件前最好了解下它的原理,以便寫出安全高效的插件。

代理鏈的生成

Mybatis支持對ExecutorStatementHandlerPameterHandlerResultSetHandler進(jìn)行攔截,也就是說會對這4種對象進(jìn)行代理。下面以Executor為例。Mybatis在創(chuàng)建Executor對象時會履行下面1行代碼:


[java] view plain copy
  1. executor =(Executor) interceptorChain.pluginAll(executor);  


InterceptorChain里保存了所有的攔截器,它在mybatis初始化的時候創(chuàng)建。上面這句代碼的含義是調(diào)用攔截器鏈里的每一個攔截器順次對executor進(jìn)行plugin(插入?)代碼以下:

[java] view plain copy
  1.  /** 
  2.   * 每個攔截器對目標(biāo)類都進(jìn)行1次代理 
  3.   * @paramtarget 
  4.   * @return 層層代理后的對象 
  5.   */  
  6.  public ObjectpluginAll(Object target) {  
  7.      for(Interceptor interceptor : interceptors) {  
  8.          target= interceptor.plugin(target);  
  9.      }  
  10.      returntarget;  
  11. }  

下面以1個簡單的例子來看看這個plugin方法里到底產(chǎn)生了甚么。

[java] view plain copy
  1. @Intercepts({@Signature(type = Executor.class, method ="update", args = {MappedStatement.class, Object.class})})  
  2. public class ExamplePlugin implements Interceptor {  
  3.     @Override  
  4.     public Objectintercept(Invocation invocation) throws Throwable {  
  5.         returninvocation.proceed();  
  6.     }  
  7.   
  8.     @Override  
  9.     public Objectplugin(Object target) {  
  10.         returnPlugin.wrap(target, this);  
  11.     }  
  12.   
  13.     @Override  
  14.     public voidsetProperties(Properties properties) {  
  15.     }  
  16. }  


每個攔截器都必須實現(xiàn)上面的3個方法,其中:

1)       Object intercept(Invocation invocation)是實現(xiàn)攔截邏輯的地方,內(nèi)部要通過invocation.proceed()顯式地推動責(zé)任鏈前進(jìn),也就是調(diào)用下1個攔截器攔截目標(biāo)方法。

2)       Object plugin(Object target) 就是用當(dāng)前這個攔截器生成對目標(biāo)target的代理,實際是通過Plugin.wrap(target,this) 來完成的,把目標(biāo)target和攔截器this傳給了包裝函數(shù)。

3)       setProperties(Properties properties)用于設(shè)置額外的參數(shù),參數(shù)配置在攔截器的Properties節(jié)點里。

注解里描寫的是指定攔截方法的簽名  [type,method,args] (即對哪一種對象的哪一種方法進(jìn)行攔截),它在攔截前用于決斷。

Plugin.wrap方法

從前面可以看出,每一個攔截器的plugin方法是通過調(diào)用Plugin.wrap方法來實現(xiàn)的。代碼以下:

[java] view plain copy
  1. public staticObject wrap(Object target, Interceptor interceptor) {  
  2.    //從攔截器的注解中獲得攔截的類名和方法信息  
  3.    Map, Set> signatureMap =getSignatureMap(interceptor);  
  4.    Class type = target.getClass();  
  5.    //解析被攔截對象的所有接口(注意是接口)  
  6.    Class[] interfaces = getAllInterfaces(type, signatureMap);  
  7.    if(interfaces.length > 0) {  
  8.         //生成代理對象, Plugin對象為該代理對象的InvocationHandler  (InvocationHandler屬于java代理的1個重要概念,不熟習(xí)的請參考相干概念)  
  9.         returnProxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target,interceptor,signatureMap));  
  10.     }  
  11.     returntarget;  
  12. }   

 這個Plugin類有3個屬性:

   private Object target;//被代理的目標(biāo)類

   private Interceptor interceptor;//對應(yīng)的攔截器

   private Map, Set> signatureMap;//攔截器攔截的方法緩存

我們再次結(jié)合(Executor)interceptorChain.pluginAll(executor)這個語句來看,這個語句內(nèi)部對

executor履行了屢次plugin,第1次plugin后通過Plugin.wrap方法生成了第1個代理類,姑且就叫executorProxy1,這個代理類的target屬性是該executor對象。第2次plugin后通過Plugin.wrap方法生成了第2個代理類,姑且叫executorProxy2,這個代理類的target屬性是executorProxy1...這樣通過每一個代理類的target屬性就構(gòu)成了1個代理鏈(從最后1個executorProxyN往前查找,通過target屬性可以找到最原始的executor類)。

代理鏈上的攔截

代理鏈生成后,對原始目標(biāo)的方法調(diào)用都轉(zhuǎn)移到代理者的invoke方法上來了。Plugin作為InvocationHandler的實現(xiàn)類,他的invoke方法是怎樣樣的呢?

[java] view plain copy

<
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国内精品久久影视免费 | 久久综合欧美 | 精品视频一区二区三区四区 | 精品欧美一区二区三区在线观看 | 最新国产精品精品视频 | 日韩欧美精品 | 久久天天躁夜夜躁狠狠躁2020 | 国产精品揄拍100视频最近 | 性欧美xxxx性 | 日韩精品在线一区 | 亚洲精品主播一区二区三区 | 欧美成人吃奶高清视频 | 嫩草影院在线观看精品视频 | 高清日本一级特黄aa大片 | 成人欧美日韩高清不卡 | 日本免费一区二区三区最新vr | 一本大道道香蕉免费 | 亚洲综合天堂 | 国产在线不卡 | 自拍偷自第11页 | 欧美三级在线观看视频 | yellow中文字幕官网是 | 国产高清一 | 国产精品亚洲高清一区二区 | 久久91亚洲精品久久91综合 | 亚洲图片 自拍 | 欧美性xxxx偷拍 | 免费在线视频网站 | 亚州综合| 麻豆亚洲精品一区二区 | 欧美一级特黄aa大片视频 | www.自拍| 亚洲天堂成人在线观看 | 在线视频 一区二区 | 国产69精品久久久久9999 | 欧美国产成人在线 | 亚洲欧美日韩精品高清 | 久久天天躁狠狠躁夜夜2020一 | 中文字幕区 | 成人国产网站v片免费观看 成人国产亚洲 | 国产成人精品视频 |