Spring 面試 迴圈依賴

2021-10-20 07:34:11 字數 2186 閱讀 3152

spring ioc 過程:

step1:讀取xml配置檔案,將xml中bean資訊解析到beandefinition,供後續使用;

step2:通過clazz.newinstance()例項化bean;

step3:利用step1中讀取的配置,找到bean-name,bean-setproperty(最終是setproperty) 等資訊,通過反射技術對step2生成的bean進行set property;

/** 快取建立完畢的spring bean */

private hashmap sharedinstancecache = new hashmap();

// 快取clazz.newinstance()例項化的bean

private mapcachemap = new concurrenthashmap<>(16);

1、測試入口類

@test

public void testabca()

2、例項化xmlbeanfactory

public xmlbeanfactory(string filename) throws bean***ception

catch (ioexception ex)

}3、解析xml中的bean資訊,bean名稱,class名稱以及property資訊,並儲存在beandefinition中

private void loadbeandefinitions(document doc) throws bean***ception

// ask superclass to eagerly instantiate singletons

preinstantiatesingletons();

} // loadbeandefinitions (document)

4、解決迴圈依賴

private final synchronized object getsharedinstance(string name) throws bean***ception

// spring bean 是否已經執行過clazz.newinstance(),但是未設定property

single = cachemap.get(name);

if (single != null)

//如兩個快取中未查到,則執行過clazz.newinstance(),建立物件,未設定property

object beaninstance = beanutils.instantiateclass(beanclass);

// 放入快取,當設定property時,如碰到迴圈依賴需要set該property,則使用此時申城的property

cachemap.put(name, beaninstance);

// ioc,執行spring bean的set方法設定屬性

object o = createbean(name, beaninstance);

//將ioc完畢的spring bean放入快取

sharedinstancecache.put(name, beaninstance);

//移除中間態

cachemap.remove(name);

return o;

}

spring 迴圈依賴

構造器依賴無法解決,使用 快取解決field屬性依賴。a的屬性依賴b,b的屬性依賴a 建立a,設定依賴屬性b,發現b沒有建立,建立b,設定依賴屬性a,先從一級快取singletonobjects中去獲取。如果獲取到就直接return 如果獲取不到或者物件正在建立中 issingletoncurren...

spring迴圈依賴

關於spring迴圈依賴網上有太多的例子,本文只是簡單的記錄一下。本文預設讀者熟悉spring核心之一控制反轉和依賴注入 在我們的開發過程中,我們基本上對迴圈依賴是無感且不用去考慮如何解決。如上圖中classa使用屬性注入了classb,classb使用屬性注入了classa。如上圖這就是產生了迴圈...

spring避免迴圈依賴

spring避免迴圈依賴 參見數 spring原始碼深度解析 第98頁 什麼是迴圈依賴,例如a引用b,b引用c,c引用a。1.如果通過構造器注入構成的迴圈依賴,這種情況下是沒有辦法解決的。例如如下配置 2.通過setter注入方式構成的迴圈依賴,只能解決單例作用域的bean迴圈依賴。通過提前暴露乙個...