真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MyBatis之簡(jiǎn)單了解Plugin

MyBatis的Configuration配置中有一個(gè)Plugin配置,根據(jù)其名可以解釋為“插件”,這個(gè)插件實(shí)質(zhì)可以理解為“攔截器”?!皵r截器”這個(gè)名詞不陌生,在眾多框架中均有“攔截器”。這個(gè)Plugin有什么用呢?活著說攔截器有什么用呢?可以想想攔截器是怎么實(shí)現(xiàn)的。Plugin用到了Java中很重要的一個(gè)特性——?jiǎng)討B(tài)代理。所以這個(gè)Plugin可以理解為,在調(diào)用一個(gè)方法時(shí),我“攔截”其方法做一些我想讓它做的事。它可以攔截以下方法:MyBatis之簡(jiǎn)單了解Plugin

創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)辛集,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

在官方文檔中有這么一句話:If you attempt to modify or override the behaviour of a given method, you’re likely to break the core of MyBatis. 謹(jǐn)慎使用自定義Plugin攔截器,因?yàn)樗赡苄薷腗ybatis核心的東西。實(shí)現(xiàn)自定義Plugin我們需要實(shí)現(xiàn) Interceptor接口。并未這個(gè)類注解@Intercepts。

MyBatis之簡(jiǎn)單了解Plugin

 1 package day_8_mybatis.util; 2  3 import java.util.Iterator; 4 import java.util.Map; 5 import java.util.Properties; 6  7 import org.apache.ibatis.plugin.Interceptor; 8 import org.apache.ibatis.plugin.Intercepts; 9 import org.apache.ibatis.plugin.Invocation;10 import org.apache.ibatis.plugin.Plugin;11 import org.apache.ibatis.plugin.Signature;12 13 /**14  * @author turbo15  *16  * 2016年10月25日17  */18 @Intercepts({19     @Signature(20         type = Map.class,21         method = "get",22         args = {Object.class}23 )})24 public class ExamplePlugin implements Interceptor {25 26     /* 此方法用于實(shí)現(xiàn)攔截邏輯27      * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)28      */29     @Override30     public Object intercept(Invocation invocation) throws Throwable {31         32         return "ExamplePlugin";33     }34 35     /* 使用當(dāng)前的這個(gè)攔截器實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的代理(內(nèi)部實(shí)現(xiàn)時(shí)Java的動(dòng)態(tài)代理)36      * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)37      */38     @Override39     public Object plugin(Object target) {40         return Plugin.wrap(target, this);41     }42 43     /* 此方法和上一節(jié)所講的自定義對(duì)象工廠中的setProperties一樣,初始化Configuration時(shí)通過配置文件配置property傳遞參數(shù)給此方法并調(diào)用。44      * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)45      */46     @Override47     public void setProperties(Properties properties) {  48         Iterator iterator = properties.keySet().iterator();49         while (iterator.hasNext()){50             String keyValue = String.valueOf(iterator.next());51             System.out.println(properties.getProperty(keyValue));52         }53     }54 55 }

MyBatis之簡(jiǎn)單了解Plugin

別忘了在mybatis-config.xml的配置文件中注冊(cè)自定義Plugin。(下面的配置中有一些遺留代碼,是在上兩節(jié)中的配置,可以選擇性的忽略。)

MyBatis之簡(jiǎn)單了解Plugin

 1  2  5    6  7  8      9         10             
11         12         13     14     22     23         24             25         26     27     28         29             30             31                 32                 33                 34                 35                         
36         37      
38     39         40         41         
42     43 44 45

MyBatis之簡(jiǎn)單了解Plugin

客戶端測(cè)試代碼:

MyBatis之簡(jiǎn)單了解Plugin

 1 package day_8_mybatis; 2  3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6  7 import org.apache.ibatis.session.SqlSession; 8  9 import day_8_mybatis.util.ExamplePlugin;10 import day_8_mybatis.util.SessionFactory;11 12 /**13  * 客戶端14  * @author turbo15  *16  * 2016年10月25日17  */18 public class Main {19 20     /**21      * @param args22      * @throws IOException 
23      */24     public static void main(String[] args) throws Exception {25         String resource = "day_8_mybatis/mybatis-config.xml";        //獲取mybatis配置文件路徑26         SqlSession sqlSession = SessionFactory.getSqlSession(resource);    //通過SessionFactory工具類(此工具類為自己構(gòu)造即util包中的SessionFactory)構(gòu)造SqlSession27         28         Map map = new HashMap();29         map = (Map)new ExamplePlugin().plugin(map);30         System.out.println(map.get(""));31 32     }33 34 }

MyBatis之簡(jiǎn)單了解Plugin

至此,我們就簡(jiǎn)單的了解了MyBatis中的Plugin。有興趣的可以看看我們?cè)诳蛻舳藴y(cè)試代碼中的第29行所調(diào)用的plugin方法。即調(diào)用了Plugin類的靜態(tài)方法wrap(Object target, Interceptor intercpetor),追蹤該方法會(huì)發(fā)現(xiàn),此方法即是Java的動(dòng)態(tài)代理。

MyBatis之簡(jiǎn)單了解Plugin

 1 public static Object wrap(Object target, Interceptor interceptor) 2     { 3         Map signatureMap = getSignatureMap(interceptor); 4         Class type = target.getClass(); 5         Class interfaces[] = getAllInterfaces(type, signatureMap); 6         if(interfaces.length > 0) 7             return Proxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap));  //返回代理類實(shí)例 8         else 9             return target;10     }

MyBatis之簡(jiǎn)單了解Plugin

動(dòng)態(tài)代理很重要,反射很重要。一定要反復(fù)理解領(lǐng)會(huì)動(dòng)態(tài)代理以及反射,這對(duì)我們讀懂很多框架源代碼有很大幫助。這篇僅僅簡(jiǎn)單了解,不做過多的深入。


網(wǎng)站標(biāo)題:MyBatis之簡(jiǎn)單了解Plugin
網(wǎng)站網(wǎng)址:http://weahome.cn/article/pcohji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部