作者:竹竿 這章我們講Java Spring的Ioc控制反轉, DI依賴註入。 閱讀此文之前,必須深入理解Java反射原理。 1、 Ioc控制反轉 原來類對象實例的創建都是有程式員自己通過new進行的。控制反轉之後,我們把創建對象的功能交給Spring,到時候我們直接用就可以了。 2、 DI註入 c
作者:竹竿
這章我們講Java Spring的Ioc控制反轉, DI依賴註入。
閱讀此文之前,必須深入理解Java反射原理。
1、 Ioc控制反轉
原來類對象實例的創建都是有程式員自己通過new進行的。控制反轉之後,我們把創建對象的功能交給Spring,到時候我們直接用就可以了。
2、 DI註入
class Bclass
{ …….
}
class Aclass{
Bclass b;
}
比如我們需要用到Aclass的對象Aobject時候,Spring Ioc幫我們創建了一個對象。這時候Aobject 裡面的b屬性為空。Ioc再創建一個Bclass對象,然後通過set方法讓b屬性引用到Ioc創建的Bclass對象。
3、 模擬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