spring-cloud-gateway中自动注入一个Bean出现循环依赖的问题解决方案:

先给出解决方案:

@Autowired
private ObjectProvider<T> objectProvider;

objectProvider.getIfAvailable().getSomeFunction();

这是我在spring-cloud-openfegin的官方issue中找到的一个方案,我选择的是这种方式解决。

另一种是在其他开源项目的issue中找到的大佬解决方案(SpringUtils非官方Util,仅提供思路):

DemoService bean = SpringUtils.getBean(DemoService.class);

问题报错内容:

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

Description:

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

   demoGatewayFilterFactory (field private com.bennett.gateway.client.DemoClient com.bennett.gateway.filter.DemoGatewayFilterFactory.demoClient)
┌─────┐
|  com.bennett.gateway.client.DemoClient
↑     ↓
|  cachedCompositeRouteLocator defined in class path resource [org/springframework/cloud/gateway/config/GatewayAutoConfiguration.class]
↑     ↓
|  routeDefinitionRouteLocator defined in class path resource [org/springframework/cloud/gateway/config/GatewayAutoConfiguration.class]
↑     ↓
|  demo2GatewayFilterFactory (field private com.bennett.gateway.client.DemoClient com.bennett.gateway.filter.Demo2GatewayFilterFactory.demoClient)
└─────┘

我在两个自定义过滤器中注入了同一个Bean,也就是一个FeginClient的接口。这与注入一个任意的Bean是一样的,也就是说注入其他类型的Bean也是会出现这种问题的。这种由框架本身引起的依赖循环可以用这种方式解决,但若是自己项目引发的问题建议优化下代码,避免两个类之间过度耦合。