日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

深入淺出Mybatis-插件原理

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

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

代理鏈的生成

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


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


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

[java] view plain copy
  1.  /** 
  2.   * 每個(gè)攔截器對目標(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個(gè)簡單的例子來看看這個(gè)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. }  


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

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

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

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

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

Plugin.wrap方法

從前面可以看出,每一個(gè)攔截器的plugin方法是通過調(diào)用Plugin.wrap方法來實(shí)現(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個(gè)重要概念,不熟習(xí)的請參考相干概念)  
  9.         returnProxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target,interceptor,signatureMap));  
  10.     }  
  11.     returntarget;  
  12. }   

 這個(gè)Plugin類有3個(gè)屬性:

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

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

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

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

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

代理鏈上的攔截

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

[java] view plain copy

<
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产日产久久高清欧美一区 | 高清一区二区三区 | 黄色毛片免费 | 午夜羞羞视频 | 国产尤物视频 | 欧美日韩国产精品综合 | 国产精品一区二区av日韩在线 | 国产成人在线播放 | 毛片免费观看视频 | 成人久久久精品乱码一区二区三区 | 久久精品国产一区二区 | 天堂成人国产精品一区 | 亚洲一区二区三区精品在线 | 久久69 | 一级毛片视频在线 | 羞羞视频在线观看 | 国产九色 | 日韩成人在线视频观看 | aaaaaaaaa特黄少妇 | 日韩操比| 国产一区二区免费在线观看 | 自拍偷拍第5页 | 欧美一级大片在线播放 | 精品一区二区三区在线观看国产 | 国产91精品一区二区 | 日韩视频免费 | heyzo久久| www.国产毛片 | 中文字幕在线播放第一页 | 亚洲精品久久久久 | 欧美成人一区二区三区片免费 | 国产午夜视频在线观看 | 国产精品1区 | 亚洲视频精品在线 | 免费a v视频 | 一二三在线视频 | 九九爱爱视频 | 国产精品尤物视频 | 青青青国产在线 | 国产精品国产精品国产专区不蜜 | 欧美一区二区三区影视 |