博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis插件原理
阅读量:6578 次
发布时间:2019-06-24

本文共 2609 字,大约阅读时间需要 8 分钟。

 插件原理

     * 在四大对象创建的时候

     * 1、每个创建出来的对象不是直接返回的,而是
     *      interceptorChain.pluginAll( parameterHandler )
     *
     * 2、获取到所有的interceptor(基于拦截器原理)(插件需要实现的接口)
     *      调用所有的Interceptor.pluginAll(target);返回target包装后的对象
     * 3、插件机制,我们可以使用插件为目标对象创建一个代理对象:AOP(面向切面的方式)
     *      我们的插件可以为四大对象创建出代理对象
     *      代理对象就可以拦截到四大对象的每一个执行方法

public Object pluginAll(Object target){    for (Interceptor interceptor:interceptors) {        target = interceptor.plugin(target);    }    return target;}

插件编写:

1、编写Interceptor的实现类

2、使用@Intercepts注解完成插件签名

 
/** * 完成了插件签名:告诉mybatis当前插件用来拦截哪个对象的哪个方法 */@Intercepts({        @Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)})public class MyFirstPlugin implements Interceptor {    /**     * intercept:拦截     *      拦截目标对象的方法的执行     * @param invocation     * @return     * @throws Throwable     */    @Override    public Object intercept(Invocation invocation) throws Throwable {        System.out.println("MyFirstPlugin....interceptor:"+invocation.getMethod());        //执行目标方法        Object proceed = invocation.proceed();        //返回执行后的返回值        return proceed;    }    /**     * plugin:包装目标对象——包装:为目标对象创建一个代理类     * @param target     * @return     */    @Override    public Object plugin(Object target) {        System.out.println("MyFirstPlugin....plugin:mybatis将要包装的对象"+target);        //我们可以借助Plugin的wrap方法来使用当前的intercept包装我们目标对象        Object wrap = Plugin.wrap(target, this);        //返回为当前target创建好的动态代理        return wrap;    }    /**     * setProperties:将插件注册时的property属性设置进来     * @param properties     */    @Override    public void setProperties(Properties properties) {        System.out.println("插件配置的信息"+properties);    }}

3、将写好的插件注册到全局配置文件中

运行结果:

多个插件运行原理

@Intercepts(     {        @Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)     })public class MySecondPlugin implements Interceptor {    @Override    public Object intercept(Invocation invocation) throws Throwable {        System.out.println("MySecondPlugin.....interceptor"+invocation.getMethod());        Object proceed = invocation.proceed();        return proceed;    }    @Override    public Object plugin(Object o) {        System.out.println("MySecondPlugin.....plugin"+o);        return Plugin.wrap(o,this);    }    @Override    public void setProperties(Properties properties) {    }}
 

多个插件就会产生多层代理

创建动态代理的时候是按照插件配置顺序创建层层动态代理对象,执行目标方法的时候是按照逆序来的

转载于:https://www.cnblogs.com/huangzhe1515023110/p/9276077.html

你可能感兴趣的文章
MTK APSoC SDK MT7621编译固件的快速开始
查看>>
【Hibernate】Hibernate.cfg.xml配置文件详解
查看>>
关于KMP算法的学习
查看>>
异步函数及Node事件循环
查看>>
delete select 表
查看>>
2. composer的简单操作
查看>>
maven setting
查看>>
二叉树中和为某一值的路径
查看>>
Android 应用语言设置的实现
查看>>
SqlSessionTemplate探究
查看>>
nagios监控插件 nagios_oracle_health+check_linux_stats.pl
查看>>
linux下用mail发送邮件
查看>>
linux入门学习分享系列之一
查看>>
深度解析Istio系列之安全模块篇
查看>>
配置管理小报111016:在bugzilla中输入新的bug,点"确认"时提示"请替这个bug输入一句摘要"?...
查看>>
Linux 系统 审计
查看>>
uPortal 5.2.1特性及定制清单
查看>>
基于TP5的微信的公众号获取登录用户信息
查看>>
大数据系列8:Sqoop – HADOOP和RDBMS数据交换
查看>>
2011年国外最受欢迎的15个科学网站
查看>>