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迴圈依賴。通過提前暴露乙個...