Java高频面试题:Spring是如何解决Bean的循环依赖?

Java高频面试题:Spring是如何解决Bean的循环依赖? 大家好我是锋哥。今天分享关于【Java高频面试题Spring是如何解决Bean的循环依赖】面试题。希望对大家有帮助Java高频面试题Spring是如何解决Bean的循环依赖Spring 通过三种方式来解决 Bean 的循环依赖问题具体如下构造器注入Constructor Injection当使用构造器注入时Spring 无法处理循环依赖。因为构造器注入会在 Bean 创建时立即要求依赖的其他 Bean这会导致死锁问题。因此Spring 不推荐在有循环依赖的情况下使用构造器注入。Setter 注入Setter InjectionSetter 注入是 Spring 解决循环依赖的常用方式。Spring 容器会首先实例化一个 Bean 的对象但并不立即完成依赖注入。它会先将该对象创建出来并缓存到容器中然后继续创建其他 Bean。待所有的 Bean 都创建完成后Spring 再为这些 Bean 注入依赖。通过这种方式Spring 可以避免因循环依赖而导致的死锁问题。三级缓存机制Spring 容器在处理循环依赖时采用了三级缓存机制来解决。具体流程如下第一级缓存Singleton Beans存放单例 Bean 的最终实例。第二级缓存Early References存放 Bean 的半成品实例即正在创建中的 Bean 对象。第三级缓存SingletonFactories存放一个通过工厂方法创建的 Bean解决了依赖注入时的循环依赖问题。这个机制的核心思想是Spring 在创建 Bean 时如果遇到循环依赖先创建一个对象的半成品即不完全的对象并将其存入 Early References 缓存中。当其他 Bean 需要该 Bean 时Spring 会注入这个半成品实例最后再进行完整的依赖注入。通过这种方式Spring 能够在不出现死锁的情况下解决循环依赖问题。