用@Intercepts拦截和mybatisPlusInterceptor.addInnerInterceptor()方法拦截有什么区别
一、语法和使用方式
@Intercepts
注解方式:- 这是通过 Java 注解的方式来定义拦截器。需要在拦截器类上使用
@Intercepts
注解,并指定要拦截的目标对象类型(如StatementHandler
、Executor
等)、方法名以及方法参数类型。 - 这种方式更加显式地指定了拦截的具体位置和条件,对于熟悉 MyBatis 底层 API 的开发者来说,可以更精确地控制拦截的时机和对象。
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}), // 其他签名 }) public class CustomInterceptor implements Interceptor { // 拦截器实现 }
- 这是通过 Java 注解的方式来定义拦截器。需要在拦截器类上使用
MybatisPlusInterceptor.addInnerInterceptor
方式:- 这是使用 MyBatis-Plus 提供的
MybatisPlusInterceptor
类来添加拦截器。通常在配置类中进行设置,将自定义的拦截器添加到 MyBatis-Plus 的拦截器链中。 - 这种方式相对更加简洁和方便,尤其对于使用 MyBatis-Plus 的项目,可以直接利用其提供的接口进行拦截器的管理。
-
@Configuration public class MyBatisConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new MybatisPlusAllSqlLog()); return interceptor; } }
- 这是使用 MyBatis-Plus 提供的
二、灵活性和可定制性
-
@Intercepts
注解方式:- 由于可以直接指定要拦截的具体方法和参数类型,具有更高的灵活性和可定制性。可以根据项目的特定需求,精确地拦截特定的方法调用,并进行相应的处理。
- 但是,这种方式需要对 MyBatis 的底层 API 有一定的了解,否则可能会出现错误的配置。
-
MybatisPlusInterceptor.addInnerInterceptor
方式:- 虽然相对简洁,但可能在某些情况下灵活性稍逊。MyBatis-Plus 的拦截器管理机制可能会有一些限制,不一定能够满足非常复杂的拦截需求。
- 不过,对于大多数常见的应用场景,这种方式已经足够方便和实用。
三、维护和可读性
-
@Intercepts
注解方式:- 代码中的注解可能会使拦截器的定义与实现紧密耦合,对于不熟悉 MyBatis 底层 API 的人来说,可能不太容易理解和维护。
- 而且,如果有多个拦截器都使用这种方式定义,可能会使代码看起来比较复杂。
-
MybatisPlusInterceptor.addInnerInterceptor
方式:- 通过配置类的方式添加拦截器,使得拦截器的管理更加集中和清晰。在配置类中可以一目了然地看到所有添加的拦截器,提高了代码的可读性和可维护性。
Interceptor和InnerInterceptor是什么,有什么区别
一、Interceptor
-
定义:
Interceptor
是 MyBatis 中的一个接口,用于定义拦截器。它允许开发者在 MyBatis 执行 SQL 语句的特定阶段进行干预,实现自定义的逻辑。
-
作用范围:
- 通常用于拦截 MyBatis 的核心对象,如
Executor
(执行器)、StatementHandler
(语句处理器)、ParameterHandler
(参数处理器)和ResultSetHandler
(结果集处理器)等。 - 可以在 SQL 语句执行的不同阶段进行操作,如执行前、执行后、参数设置、结果集处理等。
- 通常用于拦截 MyBatis 的核心对象,如
-
实现方式:
- 实现
Interceptor
接口需要实现三个方法:intercept
、plugin
和setProperties
。 intercept
方法是拦截器的核心方法,在这里编写具体的拦截逻辑。plugin
方法用于将目标对象包装成一个代理对象,以便在方法调用时触发拦截器的逻辑。setProperties
方法用于接收外部配置的属性,可以在拦截器中使用这些属性进行自定义配置。
- 实现
二、InnerInterceptor
-
定义:
InnerInterceptor
是 MyBatis-Plus 中自定义的一个接口,通常作为 MyBatis-Plus 拦截器体系中的内部拦截器接口。
-
作用范围:
- 主要用于 MyBatis-Plus 特定功能的扩展和增强。例如,分页插件、SQL 执行日志插件等 MyBatis-Plus 的功能通常是通过实现
InnerInterceptor
接口来实现的。 - 一般在 MyBatis-Plus 拦截器(如
MybatisPlusInterceptor
)内部被调用,与 MyBatis-Plus 的特定功能紧密结合。
- 主要用于 MyBatis-Plus 特定功能的扩展和增强。例如,分页插件、SQL 执行日志插件等 MyBatis-Plus 的功能通常是通过实现
-
实现方式:
- 实现
InnerInterceptor
接口需要根据具体的需求实现相应的方法。不同的内部拦截器可能有不同的方法集,具体取决于其功能。 - 例如,分页拦截器可能需要实现判断是否进行分页查询、在查询前进行分页参数设置等方法。
- 实现
三、区别总结
-
作用层次不同:
Interceptor
是 MyBatis 层面的拦截器,可以拦截 MyBatis 的核心对象,作用范围更广。InnerInterceptor
是 MyBatis-Plus 特定的内部拦截器,主要用于 MyBatis-Plus 的功能扩展,作用相对较窄。
-
功能定位不同:
Interceptor
更通用,可以用于各种自定义的逻辑干预,不限于特定的框架功能。InnerInterceptor
通常与 MyBatis-Plus 的特定功能相关联,是为了实现 MyBatis-Plus 的特定需求而设计的。
-
使用方式不同:
Interceptor
需要在 MyBatis 的配置文件中进行注册,或者通过代码手动添加到 MyBatis 的插件链中。InnerInterceptor
通常通过 MyBatis-Plus 的拦截器管理类(如MybatisPlusInterceptor
)进行添加和管理
最后自己总结
实现了InnerInterceptor类的类 可以用MybatisPlusInterceptor里的addInnerInterceptor()方法来把这个拦截器放进去,也可以自己写一个手动放进去。但是实现了Interceptor类的类不能用
addInnerInterceptor()方法,用@Intercepts来自己写,实现一些拦截需求。
还有需要学习的地方:
就是,MybatisPlusInterceptor里的addInnerInterceptor()方法和@Intercepts他们的拦截链是怎么样的,都是怎么注入进去的,他们是把拦截的条件加到一起了,还是有不同的拦截器,顺序又是什么。