mybatis之插件机制,java面试分布式事务

知识点

  • 什么是插件

  • 如何自定义插件

  • 插件实现原理

什么是插件

相信大家平时肯定使用过很多插件,比如eclipse插件、idea的插件、chrome浏览器插件等,简单地说,插件就是一种扩展,它不属于核心功能,没有它不影响我们正常使用,有了它能够让我们使用起来更方便,属于锦上添花。以下引用知乎一篇文章部分内容:

主程序如果希望自身的功能可以被扩展,其需要:

  1. 提供一组服务 (Service Interface)。其提供(约束)了插件对主体能力可控制的边界。服务定义的越精细,插件控制的粒度越小,能力越大,但耦合度和复杂度也越高。

  2. 定义一种扩展契约 (Plug-In Interface),其描述了插件应该如何设计以便于主程序发现。并通过插件管理模块 (Plug-In Manager) 来发现、维护插件。插件通过实现主程序规定的扩展契约(通常是一个接口),标明自己的身份,并接收来自主程序的事件响应。通过调动主程序提供的服务,实现和主程序的交互。这一过程,通常都是被主程序以 SDK (Software Development Kit) 的形式封装。

image.png

一款好的产品必然有一套灵活的扩展机制,作为目前国内互联网公司用得最多的持久化框架,mybatis 自然也提供了一套扩展机制,也就是插件。

如何自定义插件

在介绍完插件的概念之后,我们来看一下如何在 mybatis 中自定义插件。目前 mybatis 支持4种类型的插件,分别为 Executor、StatementHandler、ResultSetHandler、ParameterHandler。什么意思呢?就是说我们目前自定义插件,只能对这4种类型的方法做拦截,这里基本上涵盖了参数化、sql执行前后、结果集处理,mybatis核心逻辑也就这么多了,所以是足够用的。下面我们来自定义一个插件,实现对Executor的拦截,在查询之前打印"hello"。

1) 先定义一个类,实现拦截器功能

public class MyPlugin implements Interceptor {

@Override

public Object intercept(Invocation invocation) throws Throwable {

return null;

}

@Override

public Object plugin(Object o) {

return null;

}

@Override

public void setProperties(Properties properties) {

}

}

复制代码

2)由于我们要对 Executor 的查询进行拦截,所以在其上添加对应的拦截注解说明,当然这里是可以拦截多种接口的

@Intercepts(

value = {

@Signature(type = Executor.class, method = “query”, args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})

}

)

public class MyPlugin implements Interceptor {

}

复制代码

3) 加一个Properties类型成员用来接收配置中设置的值,并在执行具体路基之前输出配置中对应的内容,当然你也可以直接写死输出hello

@Intercepts(

value = {

@Signature(type = Executor.class, method = “query”, args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})

}

)

public class MyPlugin implements Interceptor {

private Properties properties = new Properties();

@Override

public Object intercept(Invocation invocation) throws Throwable {

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

86403950)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-lXiB2Ql3-1710886403950)]

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值