Spring5.0源码深度解析之SpringBean循环依赖问题解决方案,你了解多少?

Spring循环依赖

什么是Spring的循环依赖?循环依赖会存在哪些问题?

公众号:架构技术精选      纯技术、源码解析的公众号

示例:AService依赖BService; BService依赖AService

@Service
public class AService {
    //
    @Autowired
    public BService bService;
}
@Service
public class BService {
    @Autowired
    public AService aService;
}

上面演示的例子就是循环注入

如果改为多例的化,运行时就会报错,循环引用异常,找不到对象

@Scope("prototype")

Spring中的循环依赖问题在单例的情况下,Spring是已经帮我们解决好了,多例没有解决循环依赖问题。

为啥,多例的情况下 Spring没有去解决循环依赖问题?

因为在多例的情况下,设置的多例的对象没有明确哪一个,就会产生循环依赖问题。

Spring多例我们要:如何解决循环依赖问题?

 

我们可以自己去:明确指定引用那个对象

 
@Service
@Scope("prototype")
public class AService {
// @Autowired
public BService bService;
// 为什么Aservice在创建的时候 为什么Bservice比ASERVICE 先创建
public AService() {
System.out.println("AService被Java的反射技术创建");
}
public void setbService(BService bService) {
this.bService = bService;
}

}
@Service
@Scope("prototype")
public class BService {
// @Autowired
public AService aService;

public void setaService(AService aService) {
this.aService = aService;
}
}
public class SpringApp {
public static void main(String[] args) {
// 1. ioc容器在创建的时候所有的单例对象是不是会被创建
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
// // 对例子情况 当你在调用的时候才获取
AService aSerivce = applicationContext.getBean("AService", AService.class);
BService bSerivce = applicationContext.getBean("BService", BService.class);
aSerivce.setbService(bSerivce);
bSerivce.setaService(aSerivce);
// 循环引用异常 找不到对象
/**
* 思考问题?如果我们的项目对象必须要是多例?而且必须要循环引用 明确的指定引用那个对象
*/
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}

 

SpringBean循环依赖三级缓存概念

 

思考问题:单例对象在什么时候创建?

在IOC容器被创建的时候创建

多例的情况下,是在getbean()调用的情况下创建。多例对象每次用完就会去销毁掉。

SpringBean Aservice对象被创建流程步骤源码分析

 

 
AnnotationConfigApplicationContext applicationCo
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值