成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

了解Spring中循環依賴流程,絕殺面試官!

開發 架構
AOP代理本質是反射,反射出來的對象每次都是不同的,如果多個對象和BeanA出現循環依賴,那么只有二級緩存的話就會反射出不同的對象了。

請闡述下你對spring循環依賴的理解?真的是......禿頭是有原因的......

下面逐層深入了解,揭開它的神秘面紗!

一、什么是循環依賴

二、相關概念說明

  • spring中的一、二、三級緩存
#一級緩存:存儲所有創建完整的bean
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

#二級緩存:存儲完成實例化后的bean(createBeanInstance方法執行結束,但還未執行populateBean-屬性注入等方法)
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

#三級緩存:對象工廠,通過ObjectFactory.getObject()方法,獲取到類似于二級緩存中存儲的對象
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
  • spring bean初始化關鍵流程說明

createBeanInstance:推斷構造方法,通過反射,實例化一個對象;執行完該方法,會調用addSingletonFactory方法,將之放入三級緩存中。

// 三級緩存中存儲的是對象工廠,獲取對象時,需調用ObjectFactory.getObject(方法)
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
			if (!this.singletonObjects.containsKey(beanName)) {
				this.singletonFactories.put(beanName, singletonFactory);
				this.earlySingletonObjects.remove(beanName);
				this.registeredSingletons.add(beanName);
			}
		}

getEarlyBeanReference方法:

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
		Object exposedObject = bean;
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
				exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
			}
		}
		return exposedObject;
	}

populateBean:為上述創建的對象填充屬性信息。

initializeBean:執行aware接口、初始化方法、AOP代理【如有需要】。

三、都說spirng已經解決了循環依賴,那spring可以解決什么情況下的循環依賴?

A、B相互依賴場景

是否支持

均采用setter方法/屬性注入

支持

均采用構造器注入

不支持

A中注入B為setter方法,B中注入A為構造器

支持

A中注入B為構造器方法,B中注入A為setter方法

不支持

四、為什么說spring只解決了部分情況的循環依賴?

在調用createBeanInstance,通過反射實例化對象后,會調用addSingletonFactory方法,將創建的早期對象存放到三級緩存中。所以關鍵在于三級緩存中是否存在早期對象;比如:上述場景二:均采用構造器注入,為什么不支持該場景呢?

創建beanA時,在執行createBeanInstance(beanA)方法時,此時發現beanA依賴beanB,
則會去執行創建beanB流程,但是此時addSingletonFactory方法并沒有執行,
則三級緩存中不存在早期對象beanA,所以spring不支持“均采用構造器注入”的場景。

上述其他場景不再一一闡述。

五、只使用二級緩存可以解決循環依賴嗎?

AOP代理本質是反射,反射出來的對象每次都是不同的,如果多個對象和beanA出現循環依賴,那么只有二級緩存的話就會反射出不同的對象了。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-03-28 10:37:44

IoC依賴注入依賴查找

2022-07-26 08:40:42

Java并發工具類

2022-08-02 06:31:32

Java并發工具類

2021-04-30 20:25:20

Spring MVCJava代碼

2022-06-30 08:14:05

Java阻塞隊列

2022-07-11 10:47:46

容器JAVA

2013-11-14 13:32:43

面試流程谷歌

2023-08-11 17:13:39

JavaScrip

2019-12-25 11:22:19

負載均衡集群算法

2024-09-09 08:30:56

代碼

2021-12-20 10:30:33

forforEach前端

2024-11-14 14:53:04

2023-09-26 00:37:38

Spring微服務框架

2023-02-04 07:34:12

URLIP身份定位

2023-11-27 08:17:05

SpringJava

2021-01-06 08:34:21

Spring核心組件

2022-07-04 08:06:14

Go語言互斥鎖

2023-10-07 08:40:57

緩存屬性Spring

2022-06-10 13:56:42

Java

2020-09-26 22:04:32

數據安全傳輸HTTPSHTTP 協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线看一区二区三区 | 3p视频在线观看 | 日韩av在线免费 | 99久久久久 | 麻豆天堂 | 国产 欧美 日韩 一区 | 日韩欧美在线视频一区 | 亚洲欧美日韩成人在线 | 日本不卡在线视频 | 午夜精品久久久久久久久久久久 | 婷婷中文字幕 | 国产精品久久久久一区二区三区 | 成人欧美一区二区 | 成人午夜电影网 | 精品国产伦一区二区三区观看方式 | 午夜影院在线观看 | 成人免费一区二区三区牛牛 | 伊人伊成久久人综合网站 | 精品亚洲二区 | www.com久久久 | 久久亚洲国产精品 | 国产在线中文字幕 | 国产精品美女久久久久久不卡 | 亚洲444kkkk在线观看最新 | 一级a性色生活片久久毛片波多野 | 免费一区 | 97伦理影院| 狠狠涩| 草久久免费视频 | 久久亚洲国产精品 | 国产一区二区精品在线 | 国产一级片一区二区 | 久久久久久久久久性 | 免费av观看 | 欧美视频xxx | 国产精品亚洲精品久久 | 成人免费淫片aa视频免费 | 视频一区二区在线 | 在线欧美激情 | 欧美精品久久久久久久久久 | 日韩精品在线观看免费 |