springboot相互依赖|springboot相互依赖 server相互引用方式
目录
- springboot相互依赖server相互引用
- spring解决相互依赖的问题
- 构造器循环依赖
- setter循环依赖
- field属性注入循环依赖(prototype)
- 小结一下
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 {@Autowiredprivate B1 b1; } @Servicepublic class B1 {@Autowiredpublic C1 c1; } @Servicepublic class C1 {@Autowired public A1 a1; }
通过setter注入方式构成的循环依赖。
原理:对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(比如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。
【springboot相互依赖|springboot相互依赖 server相互引用方式】
field属性注入循环依赖(prototype)
@Service @Scope("prototype") public class A1 {@Autowiredprivate B1 b1; }@Service @Scope("prototype") public class B1 {@Autowiredpublic C1 c1; }@Service @Scope("prototype") public class C1 { @Autowiredpublic A1 a1; }
报错
文章图片
小结一下
Spring只能解决Setter方法注入的单例bean之间的循环依赖
ClassA依赖ClassB,ClassB又依赖ClassA,形成依赖闭环。Spring在获取ClassA的实例时,不等ClassA完成创建就将其曝光加入正在创建的bean缓存中。在解析ClassA的属性时,又发现依赖于ClassB,再次去获取
ClassB,当解析ClassB的属性时,又发现需要ClassA的属性,但此时的ClassA已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的ClassA的实例,直接从缓存中获取即可。从而解决循环依赖问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- SpringBoot|【随记】Springboot集成Redis配置(单机,集群)
- java的依赖倒置原则你了解多少
- highchart的draggable-points.js依赖实现图表的动态拖拽操作
- SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法
- SpringBoot 2.x 实战仿B站高性能后端项目
- 缓存|springboot2+spring cache+redis缓存
- Swagger|Swagger 接口文档
- Java学习|SpringBoot---杂七杂八---终篇
- 【SpringBoot学习笔记】配置多数据源
- SpringBoot如何进行参数校验实例详解