SpringBoot记录一次循环依赖

一、情景:项目中用到了@Async注解,在项目的Application启动类中加上了@EnableAsync注解,等到启动运行服务的时候控制台日志报错:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-11-01 11:39:19 org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter:42 report ERROR: 

        ***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

        |  acClient (field com.gxcards.app.service.impl.OrderComm com.gxcards.app.client.AcClient.orderComm)
↑     ↓
        |  orderComm
└─────┘


Disconnected from the target VM, address: '127.0.0.1:50003', transport: 'socket'

二、解决方法:通过百度大法搜索了一通发现是循环引用引起的异常(此异常与@Async没有必然联系),解决办法也是简单,在提示异常的类中使用@Lazy注解,通过延迟加载的策略,在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。如:

@Autowired
OrderComm orderComm;

换为:

@Autowired
@Lazy
OrderComm orderComm;

至此问题解决。

三、问题产生的原因(引用自Springboot循环依赖解决办法):

首先说一下什么是依赖循环,比如:我现在有一个ServiceA需要调用ServiceB的方法,那么ServiceA就依赖于ServiceB,那在ServiceB中再调用ServiceA的方法,就形成了循环依赖。Spring在初始化bean的时候就不知道先初始化哪个bean就会报错。那如何解决循环依赖,当然最好的方法是重构你的代码,进行解耦,但是重构不是一时的事情,那就使用@Lazy注解延迟加载。

你可能感兴趣的:(Java)