300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Spring循环依赖源码剖析

Spring循环依赖源码剖析

时间:2019-07-02 01:43:45

相关推荐

Spring循环依赖源码剖析

Spring循环依赖源码剖析

一、场景介绍

二、整理执行流程总结

三、源码分析

编写测试类

/*** 测试循环依赖*/@Testpublic void testCyclicDependence(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-cyclicDependence.xml");ABean aBean = applicationContext.getBean(ABean.class);aBean.print();}

在类Spring容器DefaultListableBeanFactory类中定位到方法preInstantiateSingletons(),设置断点(此方法进行Bean的实例化操作)

在此方法中,定位到实例化Bean的核心方法getBean(beanName),设置断点,进行跳转,并进入此方法中

定位到getSingleton(beanName)方法,并断点进入此方法

从一级缓存中获取BeanA,获取不到

将断点设置到类AbstractBeanFactory中,定位到创建单例bean的方法getSingleton(),进入此方法

getSingleton()方法最终执行createBean方法,进行bean的创建,因此继续进入此方法

定位到doCreateBean方法,并进入

实例化BeanA

继续向下执行,加入到spring的三级缓存,是一个工厂

将BeanA的工厂对象存储到三级缓存

BeanA属性填充

BeanA属性填充BeanB

此处流程和创建BeanA的流程一致

总结:

二级缓存:复用(如果BeanA中有多个属性bean都依赖BeanB,此时就可以直接从二级缓存中取即可)三级缓存:AOP增强对象单一原则:不建议在一个集合中存储两种状态的对象,一级缓存存储走完spring生命周期的bean,二级缓存存储未走完的对象,三级缓存存储bean的工厂对象,并且可以生产通过AOP增强的对象BeanA存在循环依赖:三级缓存--->二级缓存--->一级缓存BeanB不存在循环依赖:三级缓存--->一级缓存

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。