Ioc容器的依賴注入 上篇

2021-10-01 21:49:10 字數 2831 閱讀 6834

主要就是介紹了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 控制反轉 控制反轉是...