一、情景:项目中用到了@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注解延迟加载。