10 插件开发

插件开发

插件原理

在四大对象创建的时候

1、每个创建出来的对象不是直接返回的,而是调用 interceptorChain.pluginAll(parameterHandler);

2、获取到所有的 Interceptor(拦截器)(插件需要实现的接口) 调用interceptor.plugin(target);返回target包装后的对象

3、插件机制 我们可以使用插件为目标对象创建一个代理对象 AOP(面向切面)* 我们的插件可以为四大对象创建出代理对象 代理对象就可以拦截到四大对象的每一个执行

public Object pluginAll(Object target) { 

for (Interceptor interceptor : interceptors) {

       target = interceptor.plugin(target);   

}    

			return target;

  }

插件编写

1、编写Interceptor的实现类

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

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

/*
* 完成插件签名
*       告诉mybatis当前插件用来拦截哪个对象的哪个方法
* */
@Intercepts(
        {
         @Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)
        })
public class MyFirstPlugin implements Interceptor {

    /*
    * intercept:拦截
    *       拦截目标对象的目标方法的执行
    * */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //执行目标方法
        Object proceed = invocation.proceed();

        //返回执行后的返回值
        return proceed;
    }

    /*
    * plugin:
    *       包装目标对象:包装:为目标对象创建一个代理对象
    * */
    @Override
    public Object plugin(Object o) {
        //我们可以借助plug的wrp方法来使用当前的Interceptor包装我们的目标对象
        Object wrap = Plugin.wrap(o, this);
        //返回为当前 o 创建的动态代理
        return wrap;
    }

    /*
    * setProperties:
    *       将插件注册时的property属性设置进来
    *
    * */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的信息"+properties);
    }
}
    <!-- plugins:注册插件 -->
    <plugins>
        <plugin interceptor="com.atguigu.mybatis.dao.MyFirstPlugin">
            <property name="username" value="root"/>
            <property value="password" name="1234565"/>
        </plugin>
    </plugins>

多个插件运行流程

插件开发

    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        //动态的改变一下sql运行的参数:以前查询1号员工,实际从数据库查询3号员工
        Object target = invocation.getTarget();
        System.out.println("当前拦截到的对象:" + target);
        //拿到:StatementHandler ==> ParameterHandler===> parameterObject
        //拿到target的元数据
        MetaObject metaObject = SystemMetaObject.forObject(target);
        Object value = metaObject.getValue("parameterHandler.parameterObject");
        System.out.println("sql语句用的参数是" + value);
        //修改完sql语句要用的参数
        metaObject.setValue("parameterHandler.parameterObject",11);

        //执行目标方法
        Object proceed = invocation.proceed();

        //返回执行后的返回值
        return proceed;
    }

posted @   flypiggg  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示