做者:竹竿程序員
這章咱們講Java Spring的Ioc控制反轉, DI依賴注入。框架
閱讀此文以前,必須深刻理解Java反射原理。dom
一、 Ioc控制反轉學習
原來類對象實例的建立都是有程序員本身經過new進行的。控制反轉以後,咱們把建立對象的功能交給Spring,到時候咱們直接用就能夠了。spa
二、 DI注入xml
class Bclass對象
{ …….blog
}get
class Aclass{源碼
Bclass b;
}
好比咱們須要用到Aclass的對象Aobject時候,Spring Ioc幫咱們建立了一個對象。這時候Aobject 裏面的b屬性爲空。Ioc再建立一個Bclass對象,而後經過set方法讓b屬性引用到Ioc建立的Bclass對象。
三、 模擬Ioc實現
學習一個東西的時候,若是想弄明白,最好想一想框架內部是如何實現的,若是是我作我會怎麼實現。下面我就寫一個Ioc DI的程序。
Spring就至關於一個Bean工廠,你寫好本身的bean,輸入配置文件,Spring就能夠幫你自動生成bean對象。
下面咱們建立一個Java工程SimulateIoc 模擬Ioc
dom4j包須要,用來解析XML配置文件
咱們先寫二個Bean。內容都同樣,只是類名不同
定義一個Spring配置文件,咱們起名字叫IocConfig.xml
下面咱們來看一下TestIoc.Java文件
看一下運行結果
經過這個文件咱們能夠看出,咱們先建立了一個BeanFactory工廠,而後經過getBean方法得到指定的Bean對象。是否是很神奇,只要經過不一樣的名字,咱們就能夠得到咱們想要的對象。BeanFactory裏面到底作了什麼那?
這就是整個BeanFactory實現了。
裏面不少都是處理xml的部分,咱們主要看上面的兩個標紅的地方。
Class bean = Class.forName(cls.getText());
Object obj = bean.newInstance();
Class.forName得到指定類的類類。newInstance()得到指定類的對象。
Method entryPoint = bean.getMethod(attributename, String.class);
entryPoint.invoke(obj,value);
getMethod得到指定方法的方法調用入口。而後調用invoke就會執行方法。
若是想深刻了解上面四句。能夠看看Class文件的反射機制。或者看個人另一篇文章。
以上Ioc DI實現過程很是簡單,並無考慮太多幹擾因素和功能。因此和Spring實現不同,可是原理都是同樣的。
項目源碼下載地址:http://pan.baidu.com/s/1pKtO5L5