Mybatis之拦截器

本文探讨了Mybatis拦截器的工作流程,包括拦截器如何生效,重点解析了拦截器接口实现以及代理对象的创建过程,特别是Plugin.wrap方法在生成代理对象中的作用。
摘要由CSDN通过智能技术生成

拦截器生成及调用流程
在这里插入图片描述

Mybatis拦截器生效过程
Mybatis拦截器需要实现的接口如下

public interface Interceptor {
   

//主要做拦截后的逻辑处理
  Object intercept(Invocation invocation) throws Throwable;
//代理类生成,不符合条件则返回本身
  Object plugin(Object target);
//配置
  void setProperties(Properties properties);

}

创建拦截器,实际上是为目标对象创建代理对象,增强其功能。通过时序图可知,代理对象的生成,主要是调用Interceptor.plugin方法【这里可自定义代理对象的生成逻辑】。
实际上,Interceptor.plugin方法,我们一般会委托Plugin类来生成代理对象,即调用Plugin.wrap方法

/**
实际上是一个InvocationHandler,可百度jdk动态代理了解功能用法
*/
public class Plugin implements InvocationHandler {
   

  //被代理对象,第一个代理对象,target为实际对象,后面的代理对象,拿到的都是上一个代理对象
  private Object target; 
  //拦截器,调用wrap时传进来了
  private Interceptor interceptor;
  //拦截器上面标注的注解@Intercepts中@Signature集合,即需要代理的对象及方法
  private Map<Class<?> /*@Signature中的type*/, Set<Method>/*@Signature中的method【反射拿到】*/> signatureMap;

  private Plugin(Object target, Interceptor interceptor, Map<Class<?>, Set<Method>> signatureMap) {
   
    this.target = target;
    this.interceptor = interceptor;
    this.signatureMap = signatureMap;
  }

  public static Object wrap(Object target, Interceptor interceptor) {
   
  //通过注解拿到目标对象和方法
    Map<Class<?>, Set<</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值