前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Bean循环依赖解决: Is there an unresolvable circular reference?

Spring Bean循环依赖解决: Is there an unresolvable circular reference?

作者头像
崔认知
发布2023-06-19 14:32:10
1.5K0
发布2023-06-19 14:32:10
举报
文章被收录于专栏:nobodynobody


现象


代码语言:javascript
复制
在Spring处理不了循环依赖的情况下,
会发生异常:


BeanCurrentlyInCreationException: Error creating bean
 with name 'mvcResourceUrlProvider': 
 Requested bean is currently in creation: 
 Is there an unresolvable circular reference?
原因


虽然Spring利用三级缓存解决了部分循环依赖 问题,但是在构造函数注入的情况下不会很好 的解决: If you use predominantly constructor injection, it is possible to create an unresolvable circular dependency scenario. The Spring IoC container detects this circular reference at runtime, and throws a BeanCurrentlyInCreationException. https://docs.spring.io/spring-framework/docs/6.0.x/reference/pdf/core.pdf 解决


  • 重新设计依赖,去除循环依赖相关的设计

听说SpringBoot 2.6.x默认禁止我们循环依赖。不过临时提供了一个选项,可以关闭:

代码语言:javascript
复制
spring:
  main:
    allow-circular-references: true
  • 使用注解@Lazy,注入时

例如:

  • 属性注入时和@Autowired注解一起使用
代码语言:javascript
复制
    @Lazy
    @Autowired
    private MyBean myBean;

构造器注入时

代码语言:javascript
复制
@Component
public class MyBean {

    private MyBean2 myBean2;

    @Autowired
    public MyBean(@Lazy MyBean2 myBean2) {
        this.myBean2 = myBean2;
    }
}

使用setter方法注入

如:

代码语言:javascript
复制
   @Autowired
    public void setDao(MyDao dao) {
        this.dao = dao;
    }
    

从ApplicationContext获取依赖的bean实例

如:

代码语言:javascript
复制
@Component
public class MyContextProvider {

    @Autowired
    private ApplicationContext appContext;

    
    public <T> T getBean(Class<T> beanClass) {
        return appContext.getBean(beanClass);
    }

    public Object getBean(String beanName) {
        return appContext.getBean(beanName);
    }

}

如果不注入ApplicationContext,也可以实现ApplicationContextAware接口,获取ApplicationContext。

总结


项目中能避免循环依赖的,尽量避免;但有些避免不了了,我们只能采用上面的几种方法规避。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档