S
PRing的功能是很強大的,在其“絕不發明自己認為好的輪子,而只發明自己認為不好的輪子”的指導思想下,通過充分實踐了“一切實事求是、‘循證架構’的工作方式”的理論,基本上把輕量級的J2EE應用框架(如ORM、MVC等)進行了整合,并構架了一些常用的功能(如DAO),形成了一個功能強大的J2EE輕量級企業應用框架。
然而,或許是大家對Spring把握得還不透徹的緣故吧,看到很多軟件企業中用到的Spring功能,基本上大多數都只是用其IOC功能,有時候附帶用了其中的AOP事務治理功能。
IOC及AOP雖然不是Spring首創,然而其在這兩塊都是做得很不錯的,應該說整個Spring框架就是圍繞著其IOC實現及AOP實現架設起來的。我想,深入挖掘IOC、AOP以及Spring中的實現,使用等,對于初學者幫助會非常大,因此,從本期開始,大峽的《玩玩Spring系列》將伴隨大家一起走進IOC及AOP的世界。
由于本人水平有限,文中難免有很多不足甚至錯誤之處,還請各位朋友不吝批評指教。
一、IOC簡介
IOC-全稱Inversion of Control,中文解釋:控制反轉。另外,IOC又稱DI(全稱)Dependency Injection,中文解釋:依靠
注入。
呵呵,這些名詞搞得有點像學古文的味道哈。很多大師還都說IOC中有一個聞名的好萊塢理論:你呆著別動,到時我會找你。由于本人未到過好萊塢參加過社會實踐,因此,這句話理解有點困難。
IOC是一種新的設計模式,即IOC模式,系統中通過引入實現了IOC模式的IOC容器,即可由IOC容器來治理對象的生命周期、依靠關系等,從而使得應用程序的配置和依靠性規范與實際的應用程序代碼分開。其中一個特點就是通過文本的配件文件進行應用程序
組件間相互關系的配置,而不用重新修改并編譯具體的
java代碼。
當前比較知名的IOC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等,國內由板橋里人負責的國產開源項目Jdon框架,也是具有IOC容器功能(由于沒來得及認真研讀其
源碼,似乎jdon中IOC部份是調用Pico的IOC容器功能來實現的)。
在上面的幾個IOC容器中,輕量級的有Pico Container、Avalon、Spring、HiveMind等,超重量級的有EJB,而半輕半重的有容器有JBoss,Jdon等。
IOC究竟是什么?IOC是如何產生的?用在什么場合?為什么我們以前不用IOC,而現在要用IOC?“物有本末,事有終始”,為了更加透徹的理解這一問題,大峽打算從自己所理解的面向對象(OO)設計及編程發展歷程來進行分析,也許這樣能讓IOC的初學者更加了解IOC的發展的前因后果,爭取做到“知其然,知其所以然,使其然!”。
若大家等不急了,就直接百度一下有關IOC的其它文章,這方面國內很多先驅們已經作了很多介紹。如冰云的《IOC詳解》、板橋里人的設計模式及IOC理論等。
二、 最老的OO編程
記得曾經看《Think in Java》最早版本的時候,里面有這么一句讓人振奮話:一切都是對象。這時我們OO編程的核心是圍繞著面向對象編程的三個特性即“繼續”、“封裝”、“多態”來展開的。
2.1 封裝
那時我們學會了對現實就的事物及軟件模型進行了抽象。比如要描述一只貓,那么這支貓應該有“顏色”、“重量”、“公母”、“脾氣”、“出生日期”等屬性,另外還有“跑”、“吃”、“叫”、“貓捉老鼠”等方法。如Java代碼來表示,大致就是如下:
public Class Cat
{
private String color;//顏色
private String weight;//重量
private String sex;//公母
private String temper;//脾氣
private String birthday;//出生日期
private void run ();//跑
private void eat (Food food); //吃(食物)
private void shout(int type);//叫(類別)
private boolean chase(Mice mice);//貓捉老鼠
}
2.2 繼續
最早的OO編程時期,我們還會引入繼續,還經常鼓勵大家多用繼續,認為繼續就是OO編程思想的核心。繼續的核心就是圍繞著如何把類與類之間具有共同特性的部份抽象到基類中。認為這樣不但能使用了OO的特性,還減少了很多子類的代碼。
我們通過日常生活的常識知道,貓是一種動物,因此動物有的特性他基本上都有。于是,假如我們的系統中不但有貓,還會有很多其它的動物出現。我們就會設計一個動物類,把所有動物的共性抽象到一個基類中。這里,貓及動物基類的代碼大致如下:
public abstract Class Animal{
private String color;//顏色
private String weight;//重量
private String sex;//公母
private String temper;//脾氣
private String birthday;//出生日期
private void run ();//跑
private void eat (Food food); //吃(食物)
private void shout(int type);//叫(類別)
}
public Class Cat extends Animal
private int power;//能力
private int agility;//靈敏度
// 貓捉老鼠是特有的方法
private boolean chase(Mice mice) {
return true;
};
}