记录 有关MybatisPlusInterceptor里的addInnerInterceptor()方法和@Intercepts 都是怎么注入进去的

一、addInnerInterceptor()方法

  1. 注入方式
    • 通过调用MybatisPlusInterceptoraddInnerInterceptor()方法,可以将实现了InnerInterceptor接口的拦截器添加到MybatisPlusInterceptor的内部拦截器列表中。
  2. 在拦截链中的作用
    • 添加的内部拦截器会在MybatisPlusInterceptorintercept方法中被依次调用,当拦截到目标对象的方法时,会根据不同的目标对象类型(如ExecutorStatementHandler),遍历内部拦截器列表,判断是否执行相应的操作。
    • 如果内部拦截器的特定方法(如willDoQuerywillDoUpdate等)返回false,则会提前终止执行,否则会依次调用内部拦截器的预处理方法(如beforeQuerybeforeUpdate等)。

二、@Intercepts注解

  1. 注入方式
    • MybatisPlusInterceptor类本身使用@Intercepts注解来指定要拦截的目标对象类型、方法名和参数类型。这个注解在类加载时被 MyBatis 识别,将MybatisPlusInterceptor注册为一个拦截器。
  1. 在拦截链中的作用
    • 当 MyBatis 执行被注解指定的方法时,会调用MybatisPlusInterceptorintercept方法。这个方法会根据拦截的目标对象类型,调用相应的内部拦截器进行处理。
    • @Intercepts注解定义了MybatisPlusInterceptor在 MyBatis 拦截链中的位置,确定了它能够拦截的具体方法。

三、拦截顺序

  1. 整体顺序:

    • 当 MyBatis 执行一个被拦截的方法时,首先会根据@Intercepts注解确定是否应该调用MybatisPlusInterceptorintercept方法。
    • 如果需要调用,MybatisPlusInterceptor会根据拦截的目标对象类型,遍历内部拦截器列表,按照添加的顺序依次调用内部拦截器的相应方法进行判断和预处理。
  2. 内部拦截器顺序:

    • 通过addInnerInterceptor()方法添加内部拦截器的顺序决定了它们在拦截链中的执行顺序。先添加的内部拦截器会先被调用。

总之,MybatisPlusInterceptor通过addInnerInterceptor()方法和@Intercepts注解共同构建了一个灵活的拦截链,可以在 MyBatis 执行特定方法时依次调用不同的拦截器进行处理,实现对数据库操作的扩展和增强。

@Intercepts注解是把这个拦截器添加到内部拦截器列表还是其他的怎么了

@Intercepts注解并不是把拦截器添加到内部拦截器列表。

@Intercepts注解的作用是告诉 MyBatis 这个类是一个拦截器,并指定要拦截的目标对象类型、方法和参数。当 MyBatis 运行时,遇到符合注解中指定条件的方法调用时,会调用这个拦截器的intercept方法。

MybatisPlusInterceptor中的addInnerInterceptor()方法是将实现了InnerInterceptor接口的拦截器添加到MybatisPlusInterceptor的内部拦截器列表中。

所以,@Intercepts注解主要是用于定义拦截器本身以及其拦截的目标,而不是添加到内部拦截器列表中

使用了@Intercepts注解就相当于和MybatisPlusInterceptor一样的拦截器了是吧

使用了@Intercepts注解的拦截器与MybatisPlusInterceptor不完全一样,但在某些方面有相似之处。

相似之处

  1. 功能目的:两者都是为了在 MyBatis 的执行过程中进行拦截,以实现特定的功能扩展。例如,可以在 SQL 语句执行前后进行一些额外的处理,如日志记录、性能监控、数据过滤等。
  2. 拦截方式:都通过指定要拦截的目标对象类型、方法和参数来确定拦截的时机。当 MyBatis 执行到符合条件的方法时,会触发拦截器的逻辑。

不同之处

  1. 管理方式:

    • MybatisPlusInterceptor是 MyBatis-Plus 提供的一个拦截器管理类,它可以通过addInnerInterceptor()方法添加多个内部拦截器,方便集中管理和配置。
    • 使用@Intercepts注解的拦截器通常是独立的,需要单独进行注册和配置,管理相对分散。
  2. 灵活性:

    • MybatisPlusInterceptor可以根据不同的需求动态添加或移除内部拦截器,具有较高的灵活性。
    • 使用@Intercepts注解的拦截器一旦定义并注册,修改起来相对较麻烦,需要重新编译和部署。
  3. 功能范围:

    • MybatisPlusInterceptor可能会提供一些特定的功能或与 MyBatis-Plus 框架更好的集成,例如对分页插件等 MyBatis-Plus 功能的支持。
    • 使用@Intercepts注解的拦截器功能更加通用,但可能需要更多的自定义代码来实现与特定框架的集成。

综上所述,虽然使用@Intercepts注解的拦截器和MybatisPlusInterceptor在拦截功能上有相似之处,但在管理方式、灵活性和功能范围等方面存在一些差异。

那这两个的执行顺序是怎么样的

在 MyBatis 中,使用@Intercepts注解的拦截器和MybatisPlusInterceptor的执行顺序取决于它们在 MyBatis 插件链中的位置以及具体的调用逻辑。

一般来说,执行顺序可能如下:

  1. 如果有多个使用@Intercepts注解的独立拦截器和一个MybatisPlusInterceptor,那么 MyBatis 会按照它们在配置文件或注解中的注册顺序依次调用。

    • 如果一个使用@Intercepts注解的拦截器在配置文件中先被注册,那么它会在MybatisPlusInterceptor之前被调用。
    • 如果一个使用@Intercepts注解的拦截器在配置文件中后被注册,并且在MybatisPlusInterceptor之后,那么它会在MybatisPlusInterceptor处理完成后被调用。
  2. MybatisPlusInterceptor内部,如果通过addInnerInterceptor()方法添加了多个内部拦截器(实现了InnerInterceptor接口),那么这些内部拦截器会按照添加的顺序依次执行。

例如,假设有拦截器 A(使用@Intercepts注解)、拦截器 B(使用@Intercepts注解)和MybatisPlusInterceptor(内部有内部拦截器 C 和 D):

如果注册顺序是 A、B、MybatisPlusInterceptor,那么执行顺序可能是 A -> B -> MybatisPlusInterceptor内部的 C 和 D(按照添加顺序)。

需要注意的是,具体的执行顺序可能会因 MyBatis 的版本、配置方式以及其他因素而有所不同。在实际应用中,可以通过调试和日志记录来确定具体的执行顺序。

最后总结:

MybatisPlusInterceptor的addInnerInterceptor()方法添加了多个内部拦截器(实现了InnerInterceptor接口)是一个拦截器

用了@Intercepts注解的是相当于是一个拦截器,MybatisPlusInterceptor也是实现了Interceptor类的管理类而已

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值