iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBean创建和循环依赖
  • 315
分享到

SpringBean创建和循环依赖

2024-04-02 19:04:59 315人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1 前言2 Bean 的创建createBeanInstancepopulateBeaninitializeBean循环依赖问题总结1 前言 前文已经讲述了spring 

1 前言

前文已经讲述了spring BeanFactory 与 FactoryBean 的区别详情,在本文中将继续讲解 Bean 的创建和初始化,在这个环节中将会涉及到 Bean 的创建、初始化和循环依赖内容。

2 Bean 的创建

在前文中已经讲述了 Spring 容器启动的核心方法 refresh,关于 Bean 的创建和初始化方法都是在 finishBeanFactoryInitialization() 中进行处理,在这个阶段就是处理所有剩余的非懒加载的单例对象。

在该方法中,调用 preInstantiateSingletons() 进行 Bean 的所有单实例 bean。 在这个过程中,会获取容器中的所有 Bean, 依次进行初始化和创建对象。获取所有的 Bean 定义信息 beanDefinitionNames。在处理 Bean 时需要判断 Bean 定义信息是不是抽象的,单例,和懒加载。其核心方法为 getBean , 也许大家都知道在获取 Bean 的过程中,会经历 getBean -> doGetBean -> createBean -> doCreateBean 方法调用链,在 Spring 源码中, doXXX 的方法都是实际业务的方法,在 doCreateBean 方法中,createBeanInstance 方法是真实创建 Bean 对象的方法,在 Spring 中,都是采用反射的方法来创建对象的。这些核心的方法都是在 AbstractAutowireCapableBeanFactory 中实现,下图便是 doCreateBean 方法,其中的核心操作有三个: createBeanInstance 、populateBean、initializeBean

createBeanInstance

createBeanInstance 是创建 Bean 对象的方法,这里最终调用的是 instantiateBean 方法,最终的调用栈如下:

AbstractAutowireCapableBeanFactory.instantiate
  -> SimpleInstantiationStrategy.instantiate
      -> BeanUtils.instantiateClass
           -> ctor.newInstance

populateBean

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

initializeBean

初始化 Bean 是在实例化之后的操作,在初始化之前和之后便是 BeanPostProcessor 的操作,初始化的操作便是 invokeInitMethods 的初始化方法。

# 在初始化之前和之后执行
applyBeanPostProcessorsBeforeInitialization
applyBeanPostProcessorsAfterInitialization

初始化 Bean 的操作

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

循环依赖问题

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

在讲循环依赖如何结果之前,还是涉及到 Bean 是如何创建的,如下图所示的过程就是解决循环依赖的过程。

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

获取单例 Bean 的方法:

初始化的方法如下所示:

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

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

  • 1 如果采用了一级缓存,如果没有存在循环依赖的问题,确实是可以的。如果有存在前图中的循环依赖问题,那么就无法解决了,就只能采用两级缓存才能解决了。
  • 2 如果使用了两级缓存,确实能解决一部分的问题。但是 Bean 被 aop 代理,再使用两级缓存就不能解决问题了,必须采用三级缓存。

总结

文中主要讲述了 Spring 容器中 Bean 的创建过程已经主要的方法,另外也着重分析了循环依赖的问题.

到此这篇关于Spring-Bean创建和循环依赖的文章就介绍到这了,更多相关Spring Bean 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBean创建和循环依赖

本文链接: https://www.lsjlt.com/news/147948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBean创建和循环依赖
    目录1 前言2 Bean 的创建createBeanInstancepopulateBeaninitializeBean循环依赖问题总结1 前言 前文已经讲述了Spring ...
    99+
    2024-04-02
  • springbean循环依赖问题如何解决
    Spring框架可以通过使用构造函数注入和setter方法注入两种方式来解决循环依赖问题。1. 构造函数注入:在循环依赖的类中,通过...
    99+
    2023-09-29
    springbean
  • Spring中的循环依赖
    目录 一、什么是循环依赖?二、Bean的生命周期2.1 Spring Bean 的生命周期2.2 Bean 的生成步骤 三、三级缓存3.1三个缓存分别有什么作用 四、思路分析4.1 为什么 Spring 中还需要 singl...
    99+
    2023-08-16
    spring java 后端
  • Java Spring 循环依赖解析
    目录1、常见问题2、什么是循环依赖?3、循环依赖说明4、BeanCurrentlyInCreationException5、依赖注入的两种方式方式一:构造器方式注入依赖方式二:以 s...
    99+
    2024-04-02
  • Spring轻松解决循环依赖
    目录解决循环依赖的原理源码解析总结Spring 框架是一个流行的Java应用程序框架,它提供了许多强大的功能,如依赖注入和面向切面编程。然而在使用 Spring 框架时,我们可能会遇...
    99+
    2023-05-16
    Spring循环依赖怎么解决 Spring循环依赖
  • Spring怎么解决循环依赖
    本篇内容介绍了“Spring怎么解决循环依赖”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面最近,在...
    99+
    2024-04-02
  • 分析Spring循环依赖的坑
    本篇内容介绍了“分析Spring循环依赖的坑”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言这两天工作遇到了一个挺有意思的Sprin...
    99+
    2023-06-16
  • 怎么理解Spring循环依赖
    本篇内容介绍了“怎么理解Spring循环依赖”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常来说,如果问Spring内部如何解决循环依赖,...
    99+
    2023-06-16
  • maven循环依赖如何解决
    Maven循环依赖是指两个或多个模块之间相互依赖的情况,导致编译和构建过程中出现问题。为了解决 Maven 循环依赖问题,可以尝试以...
    99+
    2024-04-08
    maven
  • JavaSpring处理循环依赖详解
    目录01-前言:什么是循环依赖?02-Spring 如何处理循环依赖?03-Spring 中解决循环依赖的三级缓存01-前言:什么是循环依赖? 首先,我们先明确下依赖的定义。 如果一...
    99+
    2023-05-17
    Java中的Spring Spring处理循环依赖
  • spring循环依赖策略解析
    循环依赖所谓循环依赖就是多个Bean之间依赖关系形成一个闭环,例如A->B->C->...->A 这种情况,当然,最简单的循环依赖就是2个Bean之间互相依赖:A->B(A依赖B), B->A(B依赖A)...
    99+
    2023-05-31
    spring 循环 依赖策略
  • Springboot详细讲解循环依赖
    目录一、循环依赖二、循环依赖形成条件(使用构造器注入)三、循环依赖形成条件(@Aysnc注解的bean生成了对象的代理)四、针对以上问题对Spring如何解决循环依赖进行详细阐述一、...
    99+
    2024-04-02
  • java循环依赖如何解决
    在Java中,循环依赖是指两个或多个类之间存在相互依赖关系,导致无法编译或运行的情况。解决循环依赖的方法可以有以下几种: 重构代...
    99+
    2023-10-23
    java
  • SpringBoot循环依赖的症状和解决方案
    目录什么是循环依赖?问题及症状ComponentAComponentB错误解决方法构造器注入的案例延迟注入的案例接口隔离的案例什么是循环依赖? 循环依赖是指在Spring Boot ...
    99+
    2023-05-15
    Java SpringBoot循环依赖 SpringBoot循环依赖 解决SpirngBoot循环依赖
  • spring中如何解决循环依赖
    这期内容当中小编将会给大家带来有关spring中如何解决循环依赖,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.由同事抛的一个问题开始我们先看看当时出问题的代码片段:@...
    99+
    2024-04-02
  • Java中的Spring循环依赖详情
    目录一、什么是循环依赖?那么循环依赖是个问题吗?二、Bean的生命周期三、三级缓存解决循环依赖思路分析四、Spring到底解决了哪种情况下的循环依赖五、总结一、什么是循环依赖? 很简...
    99+
    2024-04-02
  • Spring循环依赖产生与解决
    目录循环依赖产生情景Spring如何解决循环依赖循环依赖产生情景 探讨如何解决循环依赖之前,更应该思考清楚什么情况下会发生这种问题? 1、模拟Prototype Bean的循环依赖 ...
    99+
    2022-12-20
    Spring如何解决循环依赖 Spring循环依赖
  • Spring循环依赖的解决方法
    这篇文章主要介绍Spring循环依赖的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!循环依赖其实就是循环引用,很多地方都说需要两个或则两个以上的bean互相持有对方最终形成闭环才是循环依赖,比如A依赖于B,B...
    99+
    2023-06-06
  • Spring Boot循环依赖怎么解决
    本文小编为大家详细介绍“Spring Boot循环依赖怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot循环依赖怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • JavaBean和SpringBean的区别及创建SpringBean方式
    目录一:对象,JavaBean,SpringBean的区别1.什么是JavaBean2.什么是SpringBean3.SpringBean和JAVABean的区别二:如何定义一个Sp...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作