首页 > 其他分享 >Spring循环依赖

Spring循环依赖

时间:2024-02-16 15:00:14浏览次数:25  
标签:初始化 依赖 对象 Spring 生命周期 缓存 bean 循环

1、Spring初始化bean的过程(bean的生命周期)

1. Spring扫描class文件得到beanDefinition
2. BeanDefinition首先根据class的构造方法反射得到一个对象(如果反射无法获取对象,则根据工厂方法生成)
3. 实现属性的依赖注入
4. 如果实现了BeanNameAware接口,调用setBeanName方法,为beanName赋值
5. 如果bean里有方法被切面增强了,则根绝原始对象生成一个代理对象
6. 最后将生成的代理对象放入singletonObjects缓存中,也就是Spring的一级缓存中(也叫单例池)

 2、三级缓存

一级:singletonObjects,存放经过完整生命周期的实例

二级:earlysingtonObjects,存放早期bean对象(生命周期进行中的对象)

三级:singletonFactories,对象工厂,一个lambda表达式,基于早期对象暴露的一个lambda表达式

3、循环依赖

在bean A的生命周期经过了反射得到具体对象之后,bean A依赖于bean B,这时会去初始化bean B实例,在初始化bean B之前,会将bean A放入二级缓存earlysingletonObjects中,并在singletonFactories里生成一个ObjectFactory,这个ObjectFactory是一个lambda表达式,可以通过表达式获取对相应的原始对象,然后在bean B初始化的时候,发现它依赖于bean A,这时getBean会调用singletonFactories的表达式获取earlysingtonObject缓存池中的原始对象,bean B生命周期结束,回到bean B,生命周期正常结束。

4、构造函数注入不能解决循环依赖的问题

bean A中通过构造函数依赖bean B,bean B中通过构造函数依赖bean A,在初始化A的时候,是在解析构造函数参数的时候去初始化bean B,这时当前的bean A还没完成实例化,连对象都还没生成,在初始化bean B的时候,在三级缓存里找不到这个bean A,又会去初始化bean A,这样就无限递归,最终都不能完成初始化。

标签:初始化,依赖,对象,Spring,生命周期,缓存,bean,循环
From: https://www.cnblogs.com/zeevy/p/18017163

相关文章

  • springboot的web项目部署_前后端整合部署
    springboot的web项目部署[2]_前后端整合部署vite.config.ts  build:{   //build编译后存放静态文件的目录   outDir:"../renren-admin/src/main/resources/static",  ShiroConfig.javafilterMap.put("/**/*.html","anon");filterMap.put(&......
  • Spring常见三种注入方式
    1、field注入(字段注入)1@Controller2publicclassFooController{3  @Autowired4  privateFooServicefooService;5  6  //简单的使用例子,下同7  publicList<Foo>listFoo(){8    returnfooService.list();9 }10}最......
  • 第三章 循环
    目录目录前言人VS计算机判断几位数数数讨论while循环验证调试do-whilewhile与do-while的流程图for循环阶乘例子for循环的计数三种循环的选择与比较前言if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作......
  • go的依赖管理
    1)为当前项目新增一个依赖包gomodtidy2)升(降)级版本 查看版本信息1.8有问题需要降级(升级也同理) 或者 ......
  • 写一个计算器加减乘除能循环接收
    需求写一个计算器加减乘除能循环接收代码实现packagecom.jichu.Method;importjava.util.Scanner;publicclassDemo07{publicstaticvoidmain(String[]args){//写一个计算器加减乘除能循环接收Scannerscanner=newScanner(System.in);......
  • Dowhile循环
    publicclassdowhille{publicstaticvoidmain(String[]args){/*do{代码语句}while(布尔表达式)*///do....while循环至少会执行一次inti=0;intsum=0;do{sum=sum+i;......
  • For循环
    publicclassFor01{publicstaticvoidmain(String[]args){/*for(初始化;布尔表达式;更新){代码语句}*/inta=1;//初始化条件while(a<=100){//条件判断System.out.println(a);a+=2;//a=a+2更......
  • For循环练习
    publicclassFor02{publicstaticvoidmain(String[]args){//计算0到100之间的奇数和、偶数和intoddSum=0;intevenSum=0;for(inti=0;i<=100;i++){if(i%2!=0){//奇数oddSum+=i;//o......
  • While循环
    publicclassWhile{publicstaticvoidmain(String[]args){/*while(布尔表达式){循环内容}*///输出1-100inti=0;while(i<100){i++;System.out.println(i);//......
  • SpringBoot整合OSS中的设计模式----单例模式
    在SpringBoot项目中使用OSS存储上传的图片,需要配置OSS设置信息。避免对象的重复创建,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,于是用到了单例模式,这里复习一下单例模式。单线程----懒汉式@Data@Component@ConfigurationProperties(prefix="aliyun.oss")pu......