Spring如何解决循环依赖? - springboot实战电商项目mall4j

Spring如何解决循环依赖?

springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)

java开源商城系统

@component
class A {
   
    private B b;
}
@component
class B {
   
    private A a;
}

类A依赖了B作为属性,类B又使用类A作为属性,彼此循环依赖。

循环依赖.jpg

源码理解:

//调用AbstractBeanFactory.doGetBean(),向IOC容器获取Bean,触发依赖注入的方法
protected <T> T doGetBean(
			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
			throws BeansException {
   
		...
         // 第一次getSingleton获取对象实例
		// 先从缓存中取是否已经有被创建过的单例类型的Bean[没有的话就去获取半成品的,也就是earlySingletonObjects,缓存二的东西]
		// 对于单例模式的Bean整个IOC容器中只创建一次,不需要重复创建
		Object sharedInstance = getSingleton(beanName);
    	...
        try {
   
            //创建单例模式Bean的实例对象
            if (mbd.isSingleton()) {
   
                //第二次getSingleton尝试创建目标对象,并且注入属性
                //这里使用了一个匿名内部类,创建Bean实例对象,并且注册给所依赖的对象
                sharedInstance = getSingleton(beanName, () -> {
   
                    try {
   
                        //创建一个指定Bean实例对象,如果有父级继承,则合并子类和父类的定义
                        return createBean(beanName, mbd, args);
                    } catch (BeansException ex) {
   
                        //显式地从容器单例模式Bean缓存中清除实例对象
                        destroySingleton(beanName);
                        throw ex;
                    }
                });
                // 如果传入的是factoryBean,则会调用其getObject方法,得到目标对象
                bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                //IOC容器创建原型模式Bean实例对象
            }
            ...
        } catch (BeansException ex) {
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值