spring循环依赖报错怎么办?

下面是解决的方法。。原理的话,我跟踪context.getBean总结了篇文章,文笔不好。可以看看:

https://blog.csdn.net/qq_36951116/article/details/100078947

 

出现循环依赖的几种情况,可以看看报错的那些bean之间有没有以下几种情况:

一、循环依赖的bean之间,通过构造方法相互注入的。

处理:出现这种情况,放弃使用构造方法注入,改为属性注入(@Autowired、@Resource、或者xml的属性注入都行)

二、循环依赖的bean的作用域不是singleton的。

处理:spring只支持单例bean的循环依赖,其他作用域的bean的循环依赖,spring解决不了。

三、循环依赖的bean,存在某个bean被后置处理器处理,并且该后置处理器返回的是一个新的bean代理实例的引用(如果该后置处理器返回的引用与原来相等,那就不符合这种情况了)

比如:

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("a")){
            System.out.println("后置处理器返回了a的代理对象");
            return MyAProxy.getAProxy(bean);
        }
        return bean;
    }

该后置处理器逻辑是:当beanName等于a时,就会返回一个代理对象引用。

当spring检测到后置处理器返回的bean引用与原来传进来的bean引用不一样,并且此时该bean又是循环依赖中的一环,那么spring就会报错。

具体原因可以看篇文章的最后一点:https://blog.csdn.net/qq_36951116/article/details/100032254

处理:

1、bean是否可以不参与循环依赖?如果必须参与循环依赖,那看第2点。

2、bean是否一定要在spring创建过程使用代理对象代理它?如果可以不需要代理,可以把代理该bean的后置处理器去掉。否则看第3点。

3、如果bean一定要参与循环依赖,并且需要在spring创建过程中产生代理对象。可以选择使用FactoryBean进行代理,通过工厂bean的getObject方法中返回代理对象。具体可以参考spring-mybatis的MapperFactoryBean,该框架就是使用工厂bean的方式产生代理对象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值