springboot中拦截器内无法自动注入mapper

拦截器与SpringContext加载冲突解决方案
本文解析了拦截器加载顺序导致的自动注入mapper为null的问题,提供了解决方案:通过@bean注解提前注册拦截器,确保其在SpringContext加载之后执行,避免mapper为空的错误。

原因是因为拦截器的加载在springcontext之前,所以自动注入的mapper是null

解决办法:

在添加拦截器之前用@bean注解将拦截器注入工厂,接着添加拦截器

就不会出现mapper是null的情况了

注意:箭头指向的地方要注意,不是new Intercepter();而是你上面写的myIntercepter()方法

 

### 如何在 Spring Boot 中集成 MyBatis Plus 拦截器 #### 添加依赖 为了在 Spring Boot 项目中使用 MyBatis Plus 的拦截器,首先需要添加相应的 Maven 或 Gradle 依赖。对于 Maven 用户来说,可以在 `pom.xml` 文件中加入如下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 这一步骤确保了项目的环境能够支持 MyBatis Plus 功能[^2]。 #### 创建自定义拦截器类 接着创建一个实现了 `Interceptor` 接口的 Java 类作为自定义拦截器。这个类负责处理 SQL 请求前后的逻辑操作,比如动态修改表名等功能。下面是一个简单的例子展示如何编写这样的拦截器: ```java import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import java.sql.Connection; import java.util.Properties; @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) }) public class DynamicTableNameInterceptor implements Interceptor { private static final ThreadLocal<String> TABLE_NAME_HOLDER = new ThreadLocal<>(); public Object intercept(Invocation invocation) throws Throwable { // 获取当前线程绑定的目标表名称 String tableName = TABLE_NAME_HOLDER.get(); if (tableName != null && !"".equals(tableName.trim())) { // 修改SQL语句中的表名为目标表名... } return invocation.proceed(); } public void setProperties(Properties properties) {} /** * 设置当前线程使用的数据库表名 */ public static void setCurrentTableName(String name){ TABLE_NAME_HOLDER.set(name); } } ``` 这段代码展示了如何通过继承 `org.apache.ibatis.plugin.Interceptor` 来实现自定义行为,并利用 `ThreadLocal` 存储特定于请求的信息以便后续访问。 #### 注册拦截器到应用程序上下文中 最后,在 Spring Boot 应用程序启动时注册上述编写的拦截器实例。可以通过重写 `MybatisPlusConfig` 配置类来完成这项工作: ```java @Configuration @EnableTransactionManagement @MapperScan("com.example.mapper") // 替换成实际包路径 public class MybatisPlusConfig { @Bean public DynamicTableNameInterceptor dynamicTableNameInterceptor() { return new DynamicTableNameInterceptor(); } @Bean public GlobalConfiguration globalConfiguration(){ GlobalConfiguration conf = new GlobalConfiguration(new DataLoader()); conf.setIdType(IdType.AUTO); // 自动增长ID策略 return conf; } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(DynamicTableNameInterceptor interceptor) { MybatisPlusInterceptor mbi = new MybatisPlusInterceptor(); mbi.addInnerInterceptor(interceptor); return mbi; } } ``` 这不仅完成了对自定义拦截器对象的注入,还设置了其他一些全局配置选项,如 ID 自动生成方式等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值