首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在一个循环中创建spring bean是可能的吗?

在一个循环中创建Spring Bean是可能的。Spring框架提供了循环依赖解决方案,可以在循环依赖的情况下成功创建Bean。

循环依赖是指两个或多个Bean之间相互依赖,形成一个闭环的情况。Spring通过使用三级缓存解决循环依赖问题。在Bean创建的过程中,首先会将正在创建的Bean放入"正在创建"缓存中,然后创建Bean的实例并进行属性注入,最后将Bean放入"已创建"缓存中。当发现循环依赖时,Spring会提前暴露正在创建的Bean,以便其他Bean可以引用它。

在循环依赖的场景下,建议使用构造函数注入而不是Setter方法注入,因为构造函数注入可以保证Bean在完全创建之前就可以获取到依赖的Bean实例。

以下是一个示例代码,演示了在循环依赖的情况下创建Spring Bean:

代码语言:txt
复制
public class BeanA {
    private BeanB beanB;

    public BeanA(BeanB beanB) {
        this.beanB = beanB;
    }
    
    // Getter and Setter
}

public class BeanB {
    private BeanA beanA;

    public BeanB() {
    }

    public void setBeanA(BeanA beanA) {
        this.beanA = beanA;
    }
    
    // Getter and Setter
}

@Configuration
public class AppConfig {
    @Bean
    public BeanA beanA(BeanB beanB) {
        return new BeanA(beanB);
    }

    @Bean
    public BeanB beanB(BeanA beanA) {
        BeanB beanB = new BeanB();
        beanB.setBeanA(beanA);
        return beanB;
    }
}

在上述示例中,BeanA依赖BeanB,而BeanB又依赖BeanA,形成了循环依赖。通过构造函数注入和Setter方法注入,可以成功创建这两个Bean。

腾讯云提供的相关产品和产品介绍链接地址如下:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring 容器原始 Bean 如何创建

方法,这个方法专门用来创建一个原始 Bean 实例。...松哥举一个例子,如果我们设置某一个 Bean Scope prototype 的话,那么当第二次获取该 Bean 实例时候,就会走 if 这条线。..."org.javaboy.bean.User"; } } 这里有一个 getName 方法,这个方法返回一个全路径,现在我们 XML 文件中可以这样配置: <bean class="...中更优雅第三方 Bean 注入):前面的 obtainFromSupplier 方法 Spring5 开始推出来 Supplier,通过回调方式去获取一个对象;第二个方法 instantiateUsingFactoryMethod...小结 好了,这就是 Spring 容器中 Bean 创建过程,我这里单纯和小伙伴们分享了原始 Bean 创建一个步骤,这块内容其实非常庞杂,以后有空我会再和小伙伴们分享。

17430

BeanPostProcessor 何时介入 Bean 创建

今天这篇原理分析,基本用法松哥之前已经讲过了,有视频也有文章,对视频感兴趣小伙伴戳这里:Spring源码应该怎么学?。...) throws BeansException { return bean; } } 这里就是两个方法,理解这两个方法有一个前提,就是此时 Spring 容器已经通过 Java 反射创建出来...Bean 对象了,只不过初始化这个 Bean 对象时候,又提供了一些配置接口: postProcessBeforeInitialization:这个 Bean 初始化之前触发,此时我们已经有一个...BeanPostProcessor 应用非常广泛,整个 Spring 体系中,也扮演了非常重要角色,如 @Bean 注解解析、AOP 动态代理生成等等许多我们日常使用功能,都是通过 BeanPostProcessor...BeanDefinition,还有一个重置 Bean

23130

Spring bean到底如何创建?(下)

本文接着上篇文章 Spring bean到底如何创建?(上) 来继续讲述spring bean其它生命周期。...,主要是实现了 @PostConstruct 、@PreDestory 、 @Resource 注解功能,当然不同阶段生效,只不过spring 都给他写在同一个类中了 除了spring实现,...八、Spring Bean销毁阶段 这个阶段不属于bean创建阶段,你平时使用bean在上一个阶段就完完全全创建好了,这个阶段spring容器关闭时候才会执行。...讲述spring bean生命周期时候,我也提到了bean作用域、spring如何使用三级缓存解决循环依赖等问题。...相信这两篇文章看完之后大家对spring bean创建和销毁过程都有一个全面的了解。 十、思考题 你知道spring还有哪些功能通过扩展BeanPostProcessor来实现么?

38120

Spring bean到底如何创建?(上)

所以本文就以常见一个面试题"spring bean生命周期"为切入点,从源码角度带领大家来看一看 spring bean到底如何创建 。...本文基于spring源码5.1版本 讨论spring创建bean源码之前,我先大概介绍一下springioc和aop概念。...,就跟你平时newUser一个概念,后面创建对象时候,spring拿出来BeanDefinition,基于你配置信息来创建对象。...接口及其衍生接口(接下来我称为BeanPostProcessor组件)bean生命周期中一个非常核心类体系,因为spring bean创建过程中不同阶段都会回调BeanPostProcessor...其实你可以发现,springbean创建过程中提供了非常多可扩展点,你可以每个阶段改变bean创建行为,虽然可能没有人去这么做,但是spring依然提供了这些点。

36510

面试:Springbean 线程安全

Spring Bean作用域 Spring bean 作用域(scope)类型有5种: 1、singleton:单例,默认作用域。 2、prototype:原型,每次创建一个新对象。...「原型Bean」对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然不会有线程安全问题。...如果单例Bean,一个无状态Bean,也就是线程中操作不会对Bean成员执行「查询」以外操作,那么这个单例Bean线程安全。...实际上大部分时间Bean无状态(比如Dao) 所以说某种程度上来说Bean其实是安全。...虚拟机栈描述Java方法执行内存模型:每个方法执行同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

10.7K85

谈谈Spring对象跟Bean,你知道Spring怎么创建对象

两个问题 开始探讨源码前,我们先思考两个问题: 1、Spring中,什么Bean?跟对象有什么区别? 通过new关键字,反射,克隆等手段创建出来就是对象。...Spring中,Bean一定是一个对象,但是对象不一定是一个Bean一个创建出来对象要变成一个Bean要经过很多复杂工序,例如需要被我们BeanPostProcessor处理,需要经过初始化...在这里插入图片描述” 2、创建对象前,Spring还做了其它什么事情?...// 当然不能,因为获取到Bean可能一个factoryBean,如果我们传入name & + beanName 这种形式的话,那是可以返回,但是我们传入可能一个beanName,那么这个时候...// 原型模式下,我们会多次创建一个Bean,所以Spring对参数以及所使用方法做了缓存 // 第二次创建原型对象时候会进入这段缓存逻辑 // 但是这里有个问题

2.4K20

面试官:Spring bean 线程安全

Spring Bean作用域 Spring bean 作用域(scope)类型有5种: singleton:单例,默认作用域。 prototype:原型,每次创建一个新对象。...原型Bean 对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然不会有线程安全问题。...如果单例Bean,一个无状态Bean,也就是线程中操作不会对Bean成员执行 查询 以外操作,那么这个单例Bean线程安全。...实际上大部分时间Bean无状态(比如Dao) 所以说某种程度上来说Bean其实是安全。...虚拟机栈描述Java方法执行内存模型:每个方法执行同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

98620

小胖:远哥,spring bean 线程安全

Spring bean 作用域(scope)类型 singleton: 单例,默认作用域。 prototype: 原型,每次创建一个新对象。...「原型 Bean」 对于原型 Bean, 每次创建一个新对象,也就是线程之间并不存在 Bean 共享,自然不会有线程安全问题。...「spring 单例,为什么 controller、service 和 dao 确能保证线程安全?」 Spring Bean 默认单例模式,框架并没有对 bean 进行多线程封装处理。...实际上大部分时间 Bean 无状态(比如 Dao) 所以说某种程度上来说 Bean 其实是安全。...虚拟机栈描述 Java 方法执行内存模型:每个方法执行同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

1K20

你知道Spring怎么将AOP应用到Bean生命周期中?

在上篇文章中(Spring中AOP相关API及源码解析,原来AOP这样子)我们已经分析过了AOP实现源码,那么Spring如何将AOP应用到Bean生命周期呢?...官网阅读(九)SpringBean生命周期(上)文章中我们已经对这个方法做过分析了,并且这个方法本身也比较简单,所以不再对这个方法做过多赘述,我们主要关注就是Spring如何将AOP应用到Bean...方法,Spring中AOP相关API及源码解析,原来AOP这样子一文中已经提到过了,@EnableAspectJAutoProxy注解实际上就是向容器中注册了一个AnnotationAwareAspectJAutoProxyCreator...Bean是否需要被代理 // 如果已经包含了这个key,不需要在进行判断了,直接返回即可 // 因为这个方法目的就是实例化前就确认哪些Bean不需要进行AOP...return bean; } 关于创建代理具体源码分析,Spring中AOP相关API及源码解析,原来AOP这样子一文中已经做了详细介绍,所以本文不再赘述,现在我们重点将放在Spring

50800

你知道Spring怎么将AOP应用到Bean生命周期中?

30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring怎么解析配置类? 配置类为什么要添加@Configuration注解?...谈谈Spring对象跟Bean,你知道Spring怎么创建对象?...” 前言 在上篇文章中(Spring中AOP相关API及源码解析,原来AOP这样子)我们已经分析过了AOP实现源码,那么Spring如何将AOP应用到Bean生命周期呢?...方法,Spring中AOP相关API及源码解析,原来AOP这样子一文中已经提到过了,@EnableAspectJAutoProxy注解实际上就是向容器中注册了一个AnnotationAwareAspectJAutoProxyCreator...return bean; } 关于创建代理具体源码分析,Spring中AOP相关API及源码解析,原来AOP这样子一文中已经做了详细介绍,所以本文不再赘述,现在我们重点将放在Spring

1.6K00

关于 Spring Boot 中创建对象疑虑 → @Bean 与 @Component 同时作用同一个类,会怎么样?

妈:我把你翻过来,我看着你,我害怕呀   我内心一咯噔:敢情我不是天生五官平呀,哎,虽不是天生,但胜似天生了 疑虑背景   疑虑描述   最近,进行开发过程中,发现之前一个写法,类似如下   ...以我理解,@Configuration 加 @Bean创建一个 userName 不为 null UserManager 对象,而 @Component 也会创建一个 userName 为 null...→ 真的非要三级缓存   既然 UserManager 构造方法只被调用了一次,那么前面的问题: 到底注入哪个对象   答案也就清晰了,没得选了呀,只能 @Configuration 加 @Bean...升级优化   可能 Spring 团队意识到了 info 级别太不显眼问题,或者说意识到了直接覆盖处理方式不太合理   所以 Spring 5.1.2.RELEASE (Spring Boot...覆盖,默认情况下不允许   我们可以配置文件中配置: spring.main.allow-bean-definition-overriding=true ,允许 BeanDefinition 覆盖

94110

spring源码详解(一)

Ioc容器控制反转,解决层与层之间耦合问题。没出来之前如果想引用其他类需要new 对象,当出现ioc之后,通过DI依赖注入方式引用。container里面管理着bean。...beanFactory spring顶层核心接口,使用了简单工厂模式,根据传入唯一来获取bean对象,但是否传入参数后创建还传入参数前创建这个要根据具体情况来定。主要责任就是负责生产bean。...简单工厂模式:由一个工厂类根据传入参数,动态决定返回哪个产品类。 举个例子: 你(类)配置了@component,图纸需求可能有@lazy@Scope。...beanDefinitionRegisterPostPrecessor,用来注册bean定义。 前面工厂后置处理器,后面bean后置处理器beanPostProcessor。...填充属性@autowired,填充属性时候,会遇到坏依赖问题。 初始化initMethod destory 初始化之后?

30710

让你写出更加优秀代码!

验-言 公共方法都要做参数校验,参数校验不通过明确抛出异常或对应响应码: Java Bean验证已经一个很古老技术了, 会避免我们很多问题; 接口中也明确使用验证注解修饰参数和返回值, 作为一种协议要求调用方按验证注解约束传参...-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高一定要考虑性能指标,考虑是否会打垮数据库...,是否会击穿缓存; 异-宜 异常处理程序员最基本素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理catch要问一问自己,这样吃掉异常,是否合理; 下面一个反例, 导出文件controller...Spring自动扫描服务,那么这个服务默认单例,其内部成员多个线程共享,如果直接用成员变量有线程不安全。...接-洁 接口用来隔离变化,如果一个业务有几种不同形态,但都有相同处理,那么可以定义接口来隔离业务形态不同,服务调用处,通过业务类型字段来获得不同服务类。

5.4K20

京东资深架构师代码评审歪诗

java bean验证已经一个很古老技术了,会避免我们很多问题,可参考: http://beanvalidation.org/ http://www.infoq.com/cn/news/2010/03...: 不要在循环中调用服务,不要在循环中做数据库等跨网络操作 频: 写每一个方法时都要知道这个方法调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高一定要考虑性能指标,...考虑是否会打垮数据库,是否会击穿缓存 异: 异常处理程序员最基本素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理 catch 要问一问自己,这样吃掉异常,是否合理 下面一个反例, 导出文件...,另外如果使用 Spring 自动扫描服务,那么这个服务默认单例,其内部成员多个线程共享,如果直接用成员变量有线程不安全。...接偶正分壮 - 洁偶正粉妆 接: 接口用来隔离变化,如果一个业务有几种不同形态,但都有相同处理,那么可以定义接口来隔离业务形态不同,服务调用处,通过业务类型字段来获得不同服务类。

4.7K30

Spring扩展接口(3):BeanFactoryPostProcessor

在此系列文章中,我总结了Spring几乎所有的扩展接口,以及各个扩展点使用场景。并整理出一个beanspring中从被加载到最终初始化所有可扩展点顺序调用图。...这样,我们也可以看到bean如何一步步加载到spring容器中。...框架中一个重要接口,用于BeanFactory加载Bean定义之后、实例化Bean之前对BeanFactory进行自定义修改和扩展。...它允许开发人员Spring容器加载配置文件并创建Bean实例之前对Bean定义进行操作,例如修改属性值、添加额外元数据等。...接下来进入核心invokeBeanFactoryPostProcessors方法,大概逻辑先取出所有实现了BeanFactoryPostProcessor接口类,for循环中根据实现类优先级放入不同

21010

深入理解-Spring-之源码剖析IOC(一)

spring?...楼主想反向证明IOC,我们提出一个疑问:如果没有IOC会怎么样? 想象一下,没有IOC世界里,我们系统会有大量对象,这些对象有些数据,有些处理数据。...我们来一段代码证明一下多么简单: 可以看到该代码非常简单,但实际上IOC 就是这么简单,真正开发中,我们只需要在配置文件给定一个类名字符串,就什么都不用管了,对象就会创建出来,系统启动完毕之后...搭建源码研究环境 楼主研究源码思路有2个,一个创建一个简单spirng maven 项目,还有一个直接从 spirng github 上 clone 源码。...构建Be按Factory,以便产生所需要bean定义实例 * 2. 注册可能感兴趣事件 * 3. 创建bean 实例对象 * 4.

49030

深入理解-Spring-之源码剖析IOC(一)

spring?...楼主想反向证明IOC,我们提出一个疑问:如果没有IOC会怎么样? 想象一下,没有IOC世界里,我们系统会有大量对象,这些对象有些数据,有些处理数据。...我们来一段代码证明一下多么简单: 可以看到该代码非常简单,但实际上IOC 就是这么简单,真正开发中,我们只需要在配置文件给定一个类名字符串,就什么都不用管了,对象就会创建出来,系统启动完毕之后...搭建源码研究环境 楼主研究源码思路有2个,一个创建一个简单spirng maven 项目,还有一个直接从 spirng github 上 clone 源码。...构建Be按Factory,以便产生所需要bean定义实例 * 2. 注册可能感兴趣事件 * 3. 创建bean 实例对象 * 4.

85120

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

但是这样方式可能会暴露服务敏感信息,并且默认情况下,Actuator端点暴露在服务于常规HTTP一个端口上。...如果你应用程序公开部署,你可能希望添加Spring Security来进行用户身份验证。当添加Spring Security时,默认“basic”身份验证将被启用。...准备工作 开始实现自定义Starter之前,我们需要手动创建两个工程。...,这两个注解一起使用可以创建一个基于Java代码配置类,它可以用来替代加载相应XML配置文件过程。...Bean参数获取至此我们已经知道了Bean配置过程,但是还没有看到SpringBoot如何读取YAML或者Properites配置文件属性来创建数据源SagProxyAutoConfiguration

98310
领券