热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义mybatis拦截器

在自定义mybatis拦截器中,如果通过Autowired注入对象会报错Requestedbeaniscurrentlyincreation:Isthereanun

在自定义mybatis拦截器中,如果通过@Autowired注入对象会报错

Requested bean is currently in creation: Is there an unresolvable circular reference

解决方案


import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;
import java.util.Date;
import java.util.Properties;/*** @author xrj* @date 2020/5/28*/
@Slf4j
@Component
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class})})
public class MyUpdateLogInterceptor implements Interceptor {private String UPDATE="UPDATE";private String INSERT="INSERT";private String CARP="com.cdls.carp.";@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];// 获取 SQL 命令SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();// 获取参数Object object = invocation.getArgs()[1];if(object!=null){Class classObject = object.getClass();if ( classObject.getName().startsWith(CARP)) {log.info("class:"+classObject+"获取到的sql命令为:{}",sqlCommandType);try {if(INSERT.equals(SqlCommandType.INSERT.toString())){//创建人//创建时间Field createDate = null;try {createDate = classObject.getDeclaredField("createDate");} catch (NoSuchFieldException e) {//单独捕获,不能影响逻辑log.error("MyUpdateLogInterceptor createDate获取异常NoSuchFieldException:"+e.getMessage());}if(createDate!=null){createDate.setAccessible(true);createDate.set(object,new Date());}Field visible = null;try {visible = classObject.getDeclaredField("visible");} catch (NoSuchFieldException e) {log.error("MyUpdateLogInterceptor visible获取异常NoSuchFieldException:"+e.getMessage());}if(visible!=null){visible.setAccessible(true);visible.set(object,true);}}else if(UPDATE.equals(SqlCommandType.UPDATE.toString())){Field modifyDate = null;try {modifyDate = classObject.getDeclaredField("modifyDate");} catch (NoSuchFieldException e) {log.error("MyUpdateLogInterceptor modifyDate获取异常NoSuchFieldException:"+e.getMessage());}if(modifyDate!=null){modifyDate.setAccessible(true);modifyDate.set(object,new Date());}}}catch (IllegalAccessException e) {//id获取异常log.error("id获取异常:",e);}catch (Exception e) {//获取异常log.error("Exception getDeclaredField 获取异常:",e);}}}return invocation.proceed();}@Overridepublic Object plugin(Object o) {return Plugin.wrap(o,this);}@Overridepublic void setProperties(Properties properties) {}

 


import com.cdls.carp.business.service.AllDataHistoryService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/**** 對象輔助類* @author xrj* @date 2020/5/29*/
@Component
public class ServiceHelper implements InitializingBean {private static ServiceHelper instance=null;/*** 自己的對象*/@Autowiredprivate AllDataHistoryService allDataHistoryService;@Overridepublic void afterPropertiesSet() throws Exception {ServiceHelper.instance=this;}public static AllDataHistoryService getAllDataHistoryService(){return instance.allDataHistoryService;}
}

也可以这样

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;/*** @author ckinghan* @title: SpringContextUtil* @projectName platform* @description: 获取springcontext中的bean* @date 2019/10/1811:23*/
@Component
public class SpringContextUtil implements ApplicationContextAware {public static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {SpringContextUtil.context = context;}/*** 获取容器中的实例* @param clazz 根据class获取Spring容器中对应的Bean类*/public static T getBean( Class clazz){return context.getBean(clazz);}public static ApplicationContext getContext(){return context;}
}

博主强烈推荐:https://blog.csdn.net/persistencegoing/article/details/84376427

希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职  

群号:721 515 304
 

 

 

 


推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
author-avatar
长风剑客2502852893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有