負責的說,我沒有用過Spring,更沒有看過它的源碼,只是和餅子堂的朋友聊了聊,但是我覺得我已經明白Spring的IoC了(早年也試圖看過幾本Spring相關的書,往往是淺嘗輒止了,多虧這幾次聊天了)。不過這樣講,很讓人惱火,不過我覺得我確實知道Spring的內部是如何?的了,今天先把它們寫出來(我以為我知道了,但是題目還是 猜想)。
另外,前幾天,我在JavaEye上,見到了一篇關於Spring的文章,大致也是講原理的,因為那個時候我就打算寫這篇blog了,於是我沒有敢看,因為我怕,怕文章顛覆了我的想法,真是掩耳盜鈴啊。等我寫完了,我會仔細閱讀以下的。
Spring
Spring的IoC,(我以為)其最大的作用就是解耦,在實際的應用中,使得各個組件之間保持鬆散。當然了,我顯然不講使用,而是講原理。
首先,先看下面的代碼:
IA是一個介面,A實現了該介面,當我們要使用A(作為IA實現)的功能的時候,最初的Java代碼要這樣寫。
IA a = new A();a.invokeMethod();
這樣,無疑使得調用方依賴於實現方了。
而我們知道,依賴往往是不好的。如果調用方不知道實現class是A,那麼就更好了。那麼可以大致這樣寫。
IA a = (IA) factory.getBean("A");
這裡,我還是把一些看起來是Spring的代碼列出來吧,畢竟我的目的是讓人清楚Spring做了什麼,已經它是怎麼做到的。
現在,我們發現,調用方不依賴於A了,而耦合的僅僅是一個字串“A”了。那麼,這就非常好了。我實在想不出來還有比這更小的耦合方式,除非是習慣勝於配置學說至上者。
那麼這背後都需要做點什麼呢,其實很簡單,Spring所以號稱是容器(當然了,不是Servlet容器),是因為它確實有容量~,它通過尋找對象的配置項,把書寫在Xml設定檔中的class,通過反射的方法建立出來,並按照<string, object>的方式,用一個HashMap進行索引值對儲存起來。實際上,它儲存的可能不是需要的對象,而是這個對象的Factory,因為這樣有利於Lazy-Loading吧?
其實,IoC部分,就這麼簡單:調用方依賴Spring,而不是直接依賴於實現方;而Spring去通過設定檔,完成wiring,實現調用和實現直接的間接聯絡。
想到Ferry了,其實也是使用了這種手法,只是Ferry關注更多的是對象之間解耦和通訊,並且強調一對多的聯絡。
好了,讓我去搜搜那篇文章吧。建議各位看這篇,而不是我這篇(顯然我的篇幅很短)。
http://www.javaeye.com/topic/493965
可能是這篇。
本文出處:http://www.cnblogs.com/healerkx/articles/1597614.html