Spring aop 循环依赖 Is there an unresolvable circular reference?
问题描述
在使用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切点声明类也包含进去了。
解决方案:
- 把切点表达式路径定位至某个aop被增强类中
@Pointcut("execution(* com.xopencode.spring.aop.MathCalculator.*(..))")
public void pointCut() {}
- 把Aspect切面增强类移到其他路径
Spring aop 循环依赖 Is there an unresolvable circular reference?相关推荐
- 【源码分析】Spring的循环依赖(setter注入、构造器注入、多例、AOP)
写在前面 首先最简单的循环依赖demo就是:A->B 且 B->A.本文围绕这个例子去讲解setter注入的循环依赖.构造器注入循环依赖.多例的循环依赖.带AOP的循环依赖.以下是一些结论 ...
- 图解Spring解决循环依赖
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:juejin.cn/post/684490412216 ...
- 【Spring】Spring 解决循环依赖的 3 种方式
原文:http://www.javastack.cn/article/2020/spring-cycle-depends-on-three-ways/ 循环依赖就是N个类中循环嵌套引用,如果在日常开发 ...
- Spring 的循环依赖:真的必须非要三级缓存吗?
作者:青石路 www.cnblogs.com/youzhibing/p/14337244.html 写作背景 做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Spring 的 ...
- Spring当中循环依赖很少有人讲,今天让我们来看看吧
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- Spring当中循环依赖很少有人讲,今天一起来学习!
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- 被问麻了,Spring 如何处理循环依赖?
点击关注公众号,利用碎片时间学习 前言 Spring如何处理循环依赖?这是最近较为频繁被问到的一个面试题,在前面Bean实例化流程中,对属性注入一文多多少少对循环依赖有过介绍,这篇文章详细讲一下Spr ...
- Spring IOC循环依赖
Spring IOC循环依赖 什么是循环依赖 Spring中Bean实例的创建流程 Spring三级缓存 ClassA创建流程 思考 什么是循环依赖 ClassA中依赖ClassB ClassB中依赖 ...
- java 循环依赖_浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
最新文章
- 逻辑回归为什么使用对数损失函数
- 小区社交应用:如何打破近在眼前的物理障碍和陌生感?
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...
- The Zen of Python
- android学习一---搭建开发环境
- java 多线程下载文件
- C++基础部分_C++文件操作_二进制文件的读操作---C++语言工作笔记079
- Docker 概念-1
- 理解函数:对象(this,arguments),方法(apply(),call(),bind())。
- 【.Net码农】Stream 和 byte[] 之间的转换
- 网页微信linux,Ubuntu安装Linux网页版微信
- 逆波兰表达式(含小数)、C语言
- chan算法 matlab,TDOA定位的Chan算法MATLAB源代码
- 新计算机如何用光盘安装系统,无光驱怎么重装系统|新电脑无光驱重装系统步骤...
- UE5 live-coding和build中version“1.2“ not support build failed解决方法
- 【更新21.02.03】百分浏览器继续使用Flash Player的临时解决方案!
- 梅西自强成“霉球”,阿根廷“可能”折在半路,今年的世界杯……
- C语言程序设计作业04
- 小程序中如何实现即时通信聊天功能?
- sqlmap 使用方法