主要就是介紹了getbean()以及dogetbean()方法
我們已經從ioc容器的系列表中可以了解到:beandefinition資料的載入以及分析,以及註冊等等,以及從前面來說標誌乙個ioc容器完成初始化的事情就是beandefinition的註冊事件,其實在ioc容器完成初始化的一整個過程中,都只是完成beandefinition的資料對映功能呢,並沒有將bean的依賴關係注入ioc容器中去,同時也是沒有將bean的依賴關係注入ioc容器中去
依賴注入觸發的時機:第一種:就是ioc容器索要bean時觸發的。
第二種:就是當控制beandefinition的lazy-init屬性讓容器完成對bean的預例項化
這兩者最大的區別:就是索要bean是在ioc容器初始化之後才進行的,但是控制beandefinition的lazy-init屬性是ioc容器初始化過程中完成的
具體的方法標誌著ioc容器依賴注入的開始-beanfactory介面中的getbean()方法
下面就是具體的分析getbean()原始碼
//可以看見getbean()方法位於abstractbeanfactory類
//在getbean()方法中就是呼叫了dogetbean()方法
public object getbean(string name) throws bean***ception
public t getbean(string name, class requiredtype) throws bean***ception
下面解析dogetbean()方法中的原始碼
//這裡是實際獲取到bean物件的方法所在
protected t dogetbean(string name, @nullable class requiredtype, @nullable object[
] args, boolean typecheckonly) throws bean***ception
else
}
//這裡取得結果就是factorybean的生產結果
bean = this.getobjectforbeaninstance(sharedinstance, name, beanname, (rootbeandefinition)null);}
else
//這是從beanfactory容器中去檢視是否存在bean進行檢查,如果當前beanfactory中並存在,那麼就往雙親工廠中去查詢
beanfactory parentbeanfactory = this.getparentbeanfactory();
if(parentbeanfactory != null &&
!this.containsbeandefinition(beanname))
if (args != null)
if (requiredtype != null)
return parentbeanfactory.getbean(nametolookup)
; }
if (
!typecheckonly)
try
//註冊依賴的bean物件,根據dep以及beanname兩個屬性
this.registerdependentbean(dep, beanname)
; try catch (nosuchbeandefinitionexception var24)}}
//這裡是通過判斷建立出的beandefintion是否為singleton型別,如果是將呼叫getsingleton方法根據beanname獲取到物件
if(mbd.issingleton(
)) catch (bean***ception var5)})
; bean = this.getobjectforbeaninstance(sharedinstance, name, beanname, mbd);}
else
if(mbd.isprototype(
)) finally
bean = this.getobjectforbeaninstance(prototypeinstance, name, beanname, mbd);}
else
try finally
return var4;})
; bean = this.getobjectforbeaninstance(scopedinstance, name, beanname, mbd)
;} catch (illegalstateexception var23)
}} catch (bean***ception var26)
} //在這裡是對bean型別進行校驗,如果沒有問題就返回新建立的bean,這個bean是已經包含了依賴關係的bean
if(requiredtype != null &&
!requiredtype.isinstance(bean))
else
} catch (typemismatchexception var25)
throw new beannotofrequiredtypeexception(name, requiredtype, bean.getclass());
}}else
}
以上就是dogetbean方法的原始碼解析了,這也是相當於是依賴注入的入口,在這裡觸發依賴注入,發生的前提就是beandefintion已經建立好
IOC容器的依賴注入
當spring ioc容器完成了bean定義資源的定位 載入和解析註冊以後,ioc容器中已經管理類bean定義的相關資料,但是此時ioc容器還沒有對所管理的bean進行依賴注入,依賴注入在以下兩種情況發生 1 使用者第一次通過getbean方法向ioc容索要bean時,ioc容器觸發依賴注入。2 當...
ioc(依賴 依賴倒置 依賴注入)
先看一下這個大佬的部落格 我只是畫個圖 1.依賴 這個很不友好,要換別的player或者meidafile要動operation 2.依賴倒置 這個好很多了,加了兩個介面,要換別的player或者meidafile,不用動operation 3.ioc 控制反轉 控制權是我們使用者自己,如果是spr...
php容器 控制反轉(IoC) 依賴注入(DI)
1 容器 容器 字面上理解就是裝東西的東西。常見的變數 物件屬性等都可以算是容器。容器存放的是物件 物件的描述 類 介面 或者是提供物件的 閉包 通過這種容器,我們得以實現許多高階的功能,其中最常提到的,就是 解耦 依賴注入 2 ioc inversion of control 控制反轉 控制反轉是...