简单了解spring bean的循环引用

看过一次spring公开课,记录一下bean的循环引用问题。

问题:

public class IndexService{
  @Autowired
  IndexDao indexDao;
}
public class IndexDao{
  @Autowired
  IndexService indexService;
}

以上的实例中IndexService依赖IndexDao,IndexDao中依赖IndexService。

spring在bean的实例化过程:

先去创建IndexDao bean,

1.创建IndexDao实例,此时还没有IndexDao bean产生。

2.去配置IndexDao对象的属性,这个属性就是IndexService,在这个配置的过程中会先把自己(IndexDao)对象放到singleFactory中;

3.然后去查找IndexService bean去填充,发现单例池(专门存放bean)中没有,然后去singleFactory中去找,还是没有。

4.创建IndexService实例,此时还没有IndexService bean。

5.去配置IndexService对象的属性,这个属性就是IndexDao,在这个配置的过程中会先把自己(IndexDao)对象放到singleFactory中;

6.然后去查找IndexDao bean去填充,发现单例池中没有,然后去singleFactory中去找,发现有了。

7.然后把属性填充到IndexService中。

8.经过4,5,6,7后已经有了IndexService,并且此时属性IndexDao有值了,然后通过步骤3再将这个IndexService注入到IndexDao

9.然后继续完成IndexDao 后续的bean的初始化。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring通过ApplicationContext主动获取bean的方法讲解

    问题1: 有个异步线程Runnable里面需要用到dao,无法通过AutoWired和compoment注解传递进来. 于是希望通过Spring context主动去获取bean. 问题2: getBean(name)获取失败. 解决: 默认的dao的name=类名(首字母小写) 例如: 接口名称:TemplateDao 则getName("templateDao")即可 通用的SpringContextUtil获取Bean 1.实现ApplicationContextAware接口

  • 详解Spring-bean的循环依赖以及解决方式

    本文主要是分析Spring bean的循环依赖,以及Spring的解决方式. 通过这种解决方式,我们可以应用在我们实际开发项目中. 1. 什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 注意,这里不是函数的循环调用,是对象的相互依赖关系.循环调用其实就是一个死循环,除非有终结条件. Spring中循环依赖场景有: (1)构造器的循环依赖 (2)field属性的循环依赖. 循环依赖的产生和解

  • Spring循环依赖正确性及Bean注入的顺序关系详解

    一.前言 我们知道 Spring 可以是懒加载的,就是当真正使用到 Bean 的时候才实例化 Bean.当然也不全是这样,例如配置 Bean 的 lazy-init 属性,可以控制 Spring 的加载时机.现在机器的性能.内存等都比较高,基本上也不使用懒加载,在容器启动时候来加载bean,启动时间稍微长一点儿,这样在实际获取 bean 供业务使用时,就可以减轻不少负担,这个后面再做分析. 我们使用到 Bean 的时候,最直接的方式就是从 Factroy 中获取,这个就是加载 Bean 实例的源

  • 详解Spring Bean的循环依赖解决方案

    如果使用构造函数注入,则可能会创建一个无法解析的循环依赖场景. 什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 注意,这里不是函数的循环调用,是对象的相互依赖关系.循环调用其实就是一个死循环,除非有终结条件. Spring中循环依赖场景有: (1)构造器的循环依赖 (2)field属性的循环依赖. 怎么检测是否存在循环依赖 检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,

  • spring中通过ApplicationContext getBean获取注入对象的方法实例

    用SpringContextUtil实现ApplicationContextAware package util; import java.util.Locale; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; pub

  • Spring注入Bean的一些方式总结

    通过注解注入Bean 背景 我们谈到Spring的时候一定会提到IOC容器.DI依赖注入,Spring通过将一个个类标注为Bean的方法注入到IOC容器中,达到了控制反转的效果.那么我们刚开始接触Bean的时候,一定是使用xml文件,一个一个的注入,就例如下面这样. <bean id="bean" class="beandemo.Bean" /> 我们的项目一般很大的话,就需要成千上百个Bean去使用,这样写起来就很繁琐.那么Spring就帮我们实现了一

  • 简单了解spring bean的循环引用

    看过一次spring公开课,记录一下bean的循环引用问题. 问题: public class IndexService{ @Autowired IndexDao indexDao; } public class IndexDao{ @Autowired IndexService indexService; } 以上的实例中IndexService依赖IndexDao,IndexDao中依赖IndexService. spring在bean的实例化过程: 先去创建IndexDao bean, 1

  • 简单了解spring bean作用域属性singleton和prototype的区别

    这篇文章主要介绍了简单了解spring bean作用域属性singleton和prototype的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例. 换言之,当把一个bean定义设置为singleton作用域时,Sprin

  • 简单了解Spring Bean常用注解的装配

    这篇文章主要介绍了简单了解Spring Bean常用注解的装配,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基于注解的装配 在Spring框架中,尽管使用XML配置文件可以很简单地装配Bean,但如果应用中有大量的Bean需要装配,会导致XML配置文件过于庞大,不方便以后的升级与维护,因此更多的时候推荐开发者使用注解(annotation)的方式去装配Bean. 在Spring框架中定义了一系列的注解,下面介绍集中常用的注解. @Compon

  • 简单了解Spring beanfactory循环依赖命名重复2大属性

    是否允许循环依赖和bean的命名重复取决于beanfactory的两大属性 allowBeanDefinitionOverriding和allowCircularReferences.这两个属性未指定时取的是DefaultListableBeanFactory中的默认值,均为true,即默认允许同名bean和循环引用(只有单例允许). 但是假如读者用的springboot版本比较新,就会发现情况并不是这样,同名bean会冲突报错.为什么呢,跟踪源码发现是Springboot应用在2.1.8版本的

  • 简单了解Spring beanfactory循环依赖命名重复属性

    是否允许循环依赖和bean的命名重复取决于beanfactory的两大属性 allowBeanDefinitionOverriding和allowCircularReferences.这两个属性未指定时取的是DefaultListableBeanFactory中的默认值,均为true,即默认允许同名bean和循环引用(只有单例允许). 但是假如读者用的springboot版本比较新,就会发现情况并不是这样,同名bean会冲突报错.为什么呢,跟踪源码发现是Springboot应用在2.1.8版本的

  • Spring Bean的生命周期详细介绍

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关

  • spring源码学习之bean的初始化以及循环引用

    实例化方法,把bean实例化,并且包装成BeanWrapper 1.点进这个方法里面. 这个方法是反射调用类中的 factoryMethod 方法. 这要知道@Bean 方法的原理, 实际上spring 会扫描有@bean 注解的方法, 然后把方法名称设置到 BeanDefinition 的 factoryMethod属性中, 接下来就会调到上面截图中的方法实现@Bean 方法的调用. 2. 有参构造函数的时候 determineConstructorsFromBeanPostProcessor

  • 简单了解Spring循环依赖解决过程

    这篇文章主要介绍了简单了解Spring循环依赖解决过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文中会出现类的实例化跟类的初始化两个短语,为怕园友迷惑,事先声明一下,本文的实例化是指刚执行完构造器将一个对象new出来,但还未填充属性值的状态,而

  • Spring循环引用失败问题源码解析

    目录 前言: 例子 启动容器 加载circulationa AbstractBeanFactory 最终调用BeanDefinitionValueResolver circulationb加载分析 前言: 之前我们有分析过Spring是怎么解决循环引用的问题,主要思路就是三级缓存: Spring在加载beanA的时候会先调用默认的空构造函数(在没有指定构造函数实例化的前提下)得到一个空的实例引用对象,这个时候没有设置任何值,但是Spring会用缓存把它给提前暴露出来,让其他依赖beanA的bea

随机推荐