问题描述

在使用Spring通过注解方式实现AOP时报出循环依赖错误

完整的报错信息:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'logAspects': Requested bean is currently in creation: Is there an unresolvable circular reference?at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:355)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:227)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)at org.springframework.aop.aspectj.annotation.BeanFactoryAspectInstanceFactory.getAspectInstance(BeanFactoryAspectInstanceFactory.java:90)at org.springframework.aop.aspectj.annotation.LazySingletonAspectInstanceFactoryDecorator.getAspectInstance(LazySingletonAspectInstanceFactoryDecorator.java:56)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)at com.xopencode.spring.aop.MainConfigOfAOP$$EnhancerBySpringCGLIB$$638b0922.logAspects(<generated>)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)... 67 more

原因分析:

1.既然报错信息中明确的指出创建名‘logAspects’的bean出现循环依赖,那么我们直接锁定LogAspects的内容

其中我LogAspects类的创建时放在config配置类中进行声明

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {@Beanpublic LogAspects logAspects(){return new LogAspects();}
}

LogAspects类完整信息

package com.xopencode.spring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;import java.util.Arrays;@Aspect
public class LogAspects {/*** 抽取公共的切入点表达式* 1、本类引用* 2、其他的切面引用*/@Pointcut("execution(* com.xopencode.spring.aop.*.*(..))")public void pointCut() {}/*** @Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)*/@Before("pointCut()")public void logStart(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();System.out.println("前置---" + joinPoint.getSignature().getName() + "运行。。。@Before:参数列表是:{" + Arrays.asList(args) + "}");}@After("com.xopencode.spring.aop.LogAspects.pointCut()")public void logEnd(JoinPoint joinPoint) {System.out.println("最终---" + joinPoint.getSignature().getName() + "结束。。。@After");}//JoinPoint一定要出现在参数表的第一位,没有发生异常才会执行@AfterReturning(value = "pointCut()", returning = "result")public void logReturn(JoinPoint joinPoint, Object result) {System.out.println("后置---" + joinPoint.getSignature().getName() + "正常返回。。。@AfterReturning:运行结果:{" + result + "}");}@AfterThrowing(value = "pointCut()", throwing = "exception")public void logException(JoinPoint joinPoint, Exception exception) {System.out.println("异常---" + joinPoint.getSignature().getName() + "异常。。。异常信息:{" + exception + "}");}@Around("pointCut()")public Object logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("Around: 执行目标方法之前");Object proceed = proceedingJoinPoint.proceed();System.out.println("Around: 执行目标方法之后");return proceed;}}

通过查看可以发现,大部分内容都为通知增强的声明,而可能会出现循环依赖就只有切点声明部分了

@Pointcut("execution(* com.xopencode.spring.aop.*.*(..))")
public void pointCut() {}

类路径:

通过对比发现,切点路径也把Aspect切点声明类也包含进去了。


解决方案:

  1. 把切点表达式路径定位至某个aop被增强类中
@Pointcut("execution(* com.xopencode.spring.aop.MathCalculator.*(..))")
public void pointCut() {}
  1. 把Aspect切面增强类移到其他路径

Spring aop 循环依赖 Is there an unresolvable circular reference?相关推荐

  1. 【源码分析】Spring的循环依赖(setter注入、构造器注入、多例、AOP)

    写在前面 首先最简单的循环依赖demo就是:A->B 且 B->A.本文围绕这个例子去讲解setter注入的循环依赖.构造器注入循环依赖.多例的循环依赖.带AOP的循环依赖.以下是一些结论 ...

  2. 图解Spring解决循环依赖

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:juejin.cn/post/684490412216 ...

  3. 【Spring】Spring 解决循环依赖的 3 种方式

    原文:http://www.javastack.cn/article/2020/spring-cycle-depends-on-three-ways/ 循环依赖就是N个类中循环嵌套引用,如果在日常开发 ...

  4. Spring 的循环依赖:真的必须非要三级缓存吗?

    作者:青石路 www.cnblogs.com/youzhibing/p/14337244.html 写作背景 做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Spring 的 ...

  5. Spring当中循环依赖很少有人讲,今天让我们来看看吧

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  6. Spring当中循环依赖很少有人讲,今天一起来学习!

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  7. 被问麻了,Spring 如何处理循环依赖?

    点击关注公众号,利用碎片时间学习 前言 Spring如何处理循环依赖?这是最近较为频繁被问到的一个面试题,在前面Bean实例化流程中,对属性注入一文多多少少对循环依赖有过介绍,这篇文章详细讲一下Spr ...

  8. Spring IOC循环依赖

    Spring IOC循环依赖 什么是循环依赖 Spring中Bean实例的创建流程 Spring三级缓存 ClassA创建流程 思考 什么是循环依赖 ClassA中依赖ClassB ClassB中依赖 ...

  9. java 循环依赖_浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

最新文章

  1. 逻辑回归为什么使用对数损失函数
  2. 小区社交应用:如何打破近在眼前的物理障碍和陌生感?
  3. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...
  4. The Zen of Python
  5. android学习一---搭建开发环境
  6. java 多线程下载文件
  7. C++基础部分_C++文件操作_二进制文件的读操作---C++语言工作笔记079
  8. Docker 概念-1
  9. 理解函数:对象(this,arguments),方法(apply(),call(),bind())。
  10. 【.Net码农】Stream 和 byte[] 之间的转换
  11. 网页微信linux,Ubuntu安装Linux网页版微信
  12. 逆波兰表达式(含小数)、C语言
  13. chan算法 matlab,TDOA定位的Chan算法MATLAB源代码
  14. 新计算机如何用光盘安装系统,无光驱怎么重装系统|新电脑无光驱重装系统步骤...
  15. UE5 live-coding和build中version“1.2“ not support build failed解决方法
  16. 【更新21.02.03】百分浏览器继续使用Flash Player的临时解决方案!
  17. 梅西自强成“霉球”,阿根廷“可能”折在半路,今年的世界杯……
  18. C语言程序设计作业04
  19. 小程序中如何实现即时通信聊天功能?
  20. sqlmap 使用方法

热门文章

  1. python 常用库收集
  2. 2013全国计算机二级vfp试题,2013年计算机二级VFP上机试题及答案解析29
  3. 2016年头条校招笔试题
  4. PS、Excel快捷键桌面壁纸
  5. oracle下k M G,【性能调优】Oracle AWR报告指标全解析(2)
  6. 飞腾CPU BIOS固件生成教程
  7. .co域名后缀怎么样?
  8. Lory Carousel滑块具有CSS动画和触摸支持
  9. mac Robot Framework installation not found
  10. 林业调查规划设计资质申办流程及要求?