bean循环依赖,spring循环依赖解决方案

  bean循环依赖,spring循环依赖解决方案

  00-1010 1前言2 Bean的创建CreateBeanStanCEPULATEBAININITIALIZEBEAN的循环依赖问题概述

  00-1010 spring bean factory和FactoryBean之间的区别已经详细描述过了。在本文中,我们将继续解释bean的创建和初始化,这将涉及bean的创建、初始化和循环依赖。

  00-1010在上一篇文章中,Spring容器启动的核心方法已经描述为refresh。beans的创建和初始化都是在FinishBeanfactoryinitialization()中处理的。在这个阶段,所有剩余的非惰性加载的单例都被处理。

  在这个方法中,调用preInstantiateSingletons()来创建bean的所有单实例bean。在这个过程中,依次获取、初始化容器中的所有Bean并创建对象。获取所有Bean定义信息beanDefinitionNames。在处理bean时,有必要确定bean定义信息是否是抽象的、单例的和延迟加载的。它的核心方法是getBean。可能大家都知道,在获取Bean的过程中,会经历get Bean-DoGetBean-Create Bean-doCreateBean方法的调用链。在Spring源代码中,doXXX方法都是实际业务的方法。在DocreateBean方法中,CreateBeanInstance方法是创建Bean对象的真实方法。在Spring中,使用反射方法来创建对象。这些核心方法都在AbstractTautowireCapableBeanfactory中实现。下图显示了doCreateBean方法、其中的核心操作有三个:CreateBeanstance、populateBean和initializeBean。

  

目录

 

  CreateBeauty是创建Bean对象的方法,instantiateBean方法最后在这里被调用,最终的调用栈如下:.

  abstractautowirecapablebeanfactory . instantiate-simple instantiationstrategy . instantiate-bean utils . instantiate class-ctor . new instance

  

1 前言

populateBean是设置Bean属性的方法。如下图所示,autowireByName和autowireByType这两个方法是自动注入方法。以autowireByName为例,获取属性就是以getBean的方式从IOC容器中获取对应的Bean。

 

  00-1010初始化Bean是实例化后的操作,初始化前后是BeanPostProcessor的操作,初始化操作是invokeInitMethods的初始化方法。

  #在初始化前后执行applybeanpostprocessorsbeforeign initial ization初始化 Bean 的操作

  初始化之前和之后的操作方法:

  

2 Bean 的创建

循环依赖是绕不开的话题,循环依赖的问题具体的表现形式如下:

 

  在谈论循环依赖的结果之前,它仍然涉及Bean是如何创建的。下图所示的过程就是解决循环依赖的过程。

  1创建A对象时,需要在populateBean填充属性时触发获取B对象的操作。这里,对象的构造方法将被放入createBeanInstance方法的三级缓存中。2在一轮getBean和createBean之后,再次执行属性赋值操作populateBean。此时,获取A对象的操作将被再次触发。再次获取A对象时,会从三级缓存创建一个半成品A对象,放入二级缓存,删除三级缓存,返回。此时B对象将被填充属性,赋值完成后放入一级缓存,B对象返回步骤1。3创建A对象的第一步继续。属性赋值完成后,对象将被放入一级缓存,二级缓存将被删除。下图显示了创建Bean的过程。抽象towirecapablebean factory . docreatebean方法的核心内容如下:

  获取单例 Bean 的方法:

  初始化的方法如下所示:

  通过以上三个步骤,解决了循环依赖的问题,完成了创建Bean对象的过程。

  为什么要使用三级缓存呢,说到底是要解决以下问题:

  1如果采用一级缓存,如果没有循环依赖的问题,确实是可以的。如果存在上图的循环依赖问题,就无法解决,只能通过两级缓存来解决。如果采用两级缓存,确实可以解决一些问题。但是Bean是用AOP表示的,用二级缓存解决不了问题,必须采用三级缓存。

  00-1010本文主要描述了Spring容器中Bean创建过程的主要方法,同时也着重分析了循环依赖的问题。

  这就是关于Spring-Bean的创建和循环依赖的文章。关于Spring Bean的更多信息,请搜索Popular IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: