偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

了解Spring中循環(huán)依賴流程,絕殺面試官!

開發(fā) 架構(gòu)
AOP代理本質(zhì)是反射,反射出來(lái)的對(duì)象每次都是不同的,如果多個(gè)對(duì)象和BeanA出現(xiàn)循環(huán)依賴,那么只有二級(jí)緩存的話就會(huì)反射出不同的對(duì)象了。

請(qǐng)闡述下你對(duì)spring循環(huán)依賴的理解?真的是......禿頭是有原因的......

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

一、什么是循環(huán)依賴

二、相關(guān)概念說(shuō)明

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

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

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

createBeanInstance:推斷構(gòu)造方法,通過(guò)反射,實(shí)例化一個(gè)對(duì)象;執(zhí)行完該方法,會(huì)調(diào)用addSingletonFactory方法,將之放入三級(jí)緩存中。

// 三級(jí)緩存中存儲(chǔ)的是對(duì)象工廠,獲取對(duì)象時(shí),需調(diào)用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:為上述創(chuàng)建的對(duì)象填充屬性信息。

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

三、都說(shuō)spirng已經(jīng)解決了循環(huán)依賴,那spring可以解決什么情況下的循環(huán)依賴?

A、B相互依賴場(chǎng)景

是否支持

均采用setter方法/屬性注入

支持

均采用構(gòu)造器注入

不支持

A中注入B為setter方法,B中注入A為構(gòu)造器

支持

A中注入B為構(gòu)造器方法,B中注入A為setter方法

不支持

四、為什么說(shuō)spring只解決了部分情況的循環(huán)依賴?

在調(diào)用createBeanInstance,通過(guò)反射實(shí)例化對(duì)象后,會(huì)調(diào)用addSingletonFactory方法,將創(chuàng)建的早期對(duì)象存放到三級(jí)緩存中。所以關(guān)鍵在于三級(jí)緩存中是否存在早期對(duì)象;比如:上述場(chǎng)景二:均采用構(gòu)造器注入,為什么不支持該場(chǎng)景呢?

創(chuàng)建beanA時(shí),在執(zhí)行createBeanInstance(beanA)方法時(shí),此時(shí)發(fā)現(xiàn)beanA依賴beanB,
則會(huì)去執(zhí)行創(chuàng)建beanB流程,但是此時(shí)addSingletonFactory方法并沒有執(zhí)行,
則三級(jí)緩存中不存在早期對(duì)象beanA,所以spring不支持“均采用構(gòu)造器注入”的場(chǎng)景。

上述其他場(chǎng)景不再一一闡述。

五、只使用二級(jí)緩存可以解決循環(huán)依賴嗎?

AOP代理本質(zhì)是反射,反射出來(lái)的對(duì)象每次都是不同的,如果多個(gè)對(duì)象和beanA出現(xiàn)循環(huán)依賴,那么只有二級(jí)緩存的話就會(huì)反射出不同的對(duì)象了。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2024-03-28 10:37:44

IoC依賴注入依賴查找

2022-07-26 08:40:42

Java并發(fā)工具類

2022-08-02 06:31:32

Java并發(fā)工具類

2021-04-30 20:25:20

Spring MVCJava代碼

2022-06-30 08:14:05

Java阻塞隊(duì)列

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

負(fù)載均衡集群算法

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微服務(wù)框架

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語(yǔ)言互斥鎖

2023-10-07 08:40:57

緩存屬性Spring

2022-06-10 13:56:42

Java

2020-09-26 22:04:32

數(shù)據(jù)安全傳輸HTTPSHTTP 協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)