美文网首页
插件原理

插件原理

作者: 无限骄傲 | 来源:发表于2020-12-13 00:48 被阅读0次

插件简介

一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以MyBatis为例,我们可基于MyBati s插件机制实现分页、分表,监控等功能。由于插件和业务 无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强功能

Mybati s作为一个应用广泛的优秀的ORM开源框架,这个框架具有强大的灵活性,在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插 件扩展机制。Mybatis对持久层的操作就是借助于四大核心对象。MyBatis支持用插件对四大核心对象进 行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象

l四大拦截对象

允许拦截的方法如下:

执行器Executor (update、query、commit、rollback等方法);

SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等方 法);

参数处理器ParameterHandler (getParameterObject、setParameters方法);

结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等方法);

Mybatis插件原理

在四大对象创建的时候

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

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

3、插件机制,我们可以使用插件为目标对象创建一个代理对象;AOP (面向切面)我们的插件可 以

为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行;

自定义插件实现

@Intercepts({

@Signature(type= Executor.class,

                  method ="query",

                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})

})

public class MyPlugin1implements Interceptor {

/*

        拦截方法:只要被拦截的目标对象的目标方法被执行时,每次都会执行intercept方法*/

    @Override

    public Objectintercept(Invocation invocation)throws Throwable {

System.out.println("对方法进行了增强....");

        //原方法参数

        Object[] args = invocation.getArgs();

        //原方法

        Method method = invocation.getMethod();

        //目标对象

        Object target = invocation.getTarget();

        //这里我们将原来查询的1 改为3

        Integer u=  (Integer) args[1];

        args[1]=3;

        System.out.println(u);

        return invocation.proceed(); //原方法执行

    }

/*

      主要为了把当前的拦截器生成代理存到拦截器链中*/

    @Override

    public Objectplugin(Object target) {

Object wrap = Plugin.wrap(target, this);

        return wrap;

    }

/*

        获取配置文件的参数*/

    @Override

    public void setProperties(Properties properties) {

System.out.println("获取到的配置文件的参数是:"+properties);

    }

}

配置文件:

配置自定义插件\

测试结果如下:

测试结果

源码分析

Plugin实现了InvocationHandler接口 所以最终执行的实际上是invoke方法:

invoke方法

4,在每次创建excutor时候

拦截器执行 代理放入拦截器链

相关文章

  • 代理模式

    Android插件化原理解析——Hook机制之动态代理 Android插件化原理解析——概要 Retrofit2 ...

  • taotao-Mybatis分页插件(商品列表展示)

    分页插件的原理: 使用方法: 插件名称:PageHelper,该插件目前支持Oracle、MySQL、MariaD...

  • Android插件化

    插件化涉及的东西很多,下面从基础知识、插件化技术和主流的插件化框架来介绍 基础知识 类加载器原理 反射原理 代理模...

  • bunny笔记|手写webpack

    学习目标 了解webpack打包原理 了解webpack的loader原理 了解webpack的插件原理 了解as...

  • 插件原理

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBati...

  • 插件原理

    插件简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了...

  • Logtail从入门到精通(六):工作原理简介

    摘要:Logtail数据采集原理介绍,包括文件采集原理以及插件采集原理。 文件采集原理 Logtail文件采集的流...

  • Vscode设置背景图片

    安装插件 搜索background-cover Arch/Manjaro 查看vscode安装位置 插件原理是修改...

  • android插件化研究与实践

    wengyiming.cn 原文- 插件化研究与实践 why——插件化需求背景 带着目的看源码——插件化实现原理 ...

  • Unity Android Plugin 教程-翻译

    目录Unity Android 插件教程(1/3) - 基本原理Unity Android 插件教程(1/3) -...

网友评论

      本文标题:插件原理

      本文链接:https://www.haomeiwen.com/subject/jkhugktx.html