千家信息网

怎么实现springboot相互依赖server相互引用

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,小编给大家分享一下怎么实现springboot相互依赖server相互引用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!s
千家信息网最后更新 2025年01月17日怎么实现springboot相互依赖server相互引用

小编给大家分享一下怎么实现springboot相互依赖server相互引用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

springboot相互依赖 server相互引用

public class RoleService{        @Autowired @Lazy        private UserServer userServer;}public class UserService{        @Autowired @Lazy        private RoleService roleService;}

spring解决相互依赖的问题

构造器循环依赖

@Servicepublic class A {      public A(B b) {  } }@Servicepublic class B {      public C (C c) {  }} @Servicepublic class C {      public A (A a) {  }}

通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖

描述:创建A类是,构造器需要B类,那将去创建B,在创建B时又发现需要A类,则又去创建C类,最终在创建C时发现又需要A,从而形成一个环,没办法创建。

原理:Spring容器将每一个正在创建的bean标识符放在一个"当前创建bean池"中,bean标识符创建过程中将一直保持在这个池中,因为如果在创建bean过程中发现自己已经在"当前创建bean池"中时,将会抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的bean将从"当前创建bean池"中清除掉。

setter循环依赖

@Servicepublic class A1 {      @Autowired      private B1 b1; } @Servicepublic class B1 {      @Autowired      public C1 c1;} @Servicepublic class C1 {      @Autowired public A1 a1; }

通过setter注入方式构成的循环依赖。

原理:对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(比如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。

field属性注入循环依赖(prototype)

@Service @Scope("prototype") public class A1 {       @Autowired       private B1 b1; }  @Service @Scope("prototype") public class B1 {       @Autowired       public C1 c1; }  @Service @Scope("prototype") public class C1 {       @Autowired  public A1 a1; }

报错

小结一下

Spring只能解决Setter方法注入的单例bean之间的循环依赖

ClassA依赖ClassB,ClassB又依赖ClassA,形成依赖闭环。Spring在获取ClassA的实例时,不等ClassA完成创建就将其曝光加入正在创建的bean缓存中。在解析ClassA的属性时,又发现依赖于ClassB,再次去获取

ClassB,当解析ClassB的属性时,又发现需要ClassA的属性,但此时的ClassA已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的ClassA的实例,直接从缓存中获取即可。从而解决循环依赖问题。

以上是"怎么实现springboot相互依赖server相互引用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0