1、概念理解
對Spring耳聞已久,但一直沒有時間和心情去看它,最近它的聲音是越來越大了,Java視線http://forum.javaeye.com/有不高手在談論它。於是趁著有空閑時間,我也花了兩個晚上看了看Spring,看的是夏昕的<Spring開發指南>http://www.xiaxin.net/Spring_Dev_Guide.rar,文章寫得不錯。以下談談我的學習感受
一、Spring的IoC(Inversion of Control)。
這是Spring中得有特點的一部份。IoC又被翻譯成“控制反轉”,也不知道是誰翻譯得這麼彆扭,感覺很深奧的詞。其實,原理很簡單,用一句通俗的話來說:就是用XML來定義產生的對象。IoC其實是一種設計模式,Spring只是實現了這種設計模式。
這種設計模式是怎麼來的呢?是實踐中逐漸形成的。
第一階段:用普通的無模式來寫Java程式。一般初學者都要經過這個階段。
第二階段:頻繁的開始使用介面,這時,介面一般都會伴隨著使用原廠模式。
第三階段:使用IoC模式。原廠模式還不夠好:(1)因為的類的產生代碼寫死在程式裡,如果你要換一個子類,就要修改Factory 方法。(2)一個介面常常意味著一個產生工廠,會多出很多工廠類。
可以把IoC模式看做是原廠模式的升華,可以把IoC看作是一個大工廠,只不過這個大工廠裡要產生的對象都是在XML檔案中給出定義的,然後利用Java的“反射”編程,根據XML中給出的類名產生相應的對象。從實現來看,IoC是把以前在Factory 方法裡寫死的對象產生代碼,改變為由XML檔案來定義,也就是把工廠和對象產生這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
IoC中最基本的Java技術就是“反射”編程。反射又是一個生澀的名詞,通俗的說反射就是根據給出的類名(字串)來產生對象。這種編程方式可以讓對象在產生時才決定要產生哪一種對象。我在最近的一個項目也用到了反射,當時是給出一個.properties文字檔,裡面寫了一些全類名(包名+類名),然後,要根據這些全類名在程式中產生它們的對象。反射的應用是很廣泛的,象Hibernate、String中都是用“反射”做為最基本的技術手段。
在過去,反射編程方式相對於正常的對象產生方式要慢10幾倍,這也許也是當時為什麼反射技術沒有普通應用開來的原因。但經SUN改良最佳化後,反射方式產生對象和通常對象產生方式,速度已經相差不大了(但依然有一倍以上的差距)。
所以要理解IoC,你必須先瞭解原廠模式和反射編程,否則對它產生的前因後果和實現原理都是無法理解透徹的。只要你理解了這一點,你自己也完全可以自己在程式中實現一個IoC架構,只不是這還要涉及到XML解析等其他知識,稍微麻煩一些。
IoC最大的好處是什嗎?因為把對象產生放在了XML裡定義,所以當我們需要換一個實現子類將會變成很簡單(一般這樣的對象都是現實於某種介面的),只要修改XML就可以了,這樣我們甚至可以實現對象的熱插撥(有點象USB介面和SCIS硬碟了)。
IoC最大的缺點是什嗎?(1)產生一個對象的步驟變複雜了(其實上操作上還是挺簡單的),對於不習慣這種方式的人,會覺得有些彆扭和不直觀。(2)對象產生因為是使用反射編程,在效率上有些損耗。但相對於IoC提高的維護性和靈活性來說,這點損耗是微不足道的,除非某對象的產生對效率要求特別高。(3)缺少IDE重構作業的支援,如果在Eclipse要對類改名,那麼你還需要去XML檔案裏手工去改了,這似乎是所有XML方式的缺憾所在。
總的來說IoC無論原理和實現都還算是很簡單的。一些人曾認為IoC沒什麼實際作用,這種說法是可以理解的,因為如果你在編程中很少使用介面,或很少使用原廠模式,那麼你根本就沒有使用IoC的強烈需要,也不會體會到IoC可貴之處。有些人也說要消除原廠模式、單例模式,但是都語焉不詳、人云亦云。但如果你看到IoC模式和用上Spring,那麼原廠模式和單例模式的確基本上可以不用了。但它消失了嗎?沒有!Spring的IoC實現本身就是一個大工廠,其中也包含了單例對象產生方式,只要用一個設定就可以讓對象產生由普通方式變單一執行個體方式,非常之簡單。
總結:
(1)IoC原理很簡單,作用的針對性也很強,不要把它看得很玄乎。
(2)要理解IoC,首先要瞭解“工廠、介面、反射”這些概念。
二、Spring的MVC
如果你已經熟悉Struts,那麼不必把MVC做為重點學習內容。基本上我認為Spring MVC是一個雞肋,它的技術上很先進,但易用性上沒有Struts好。而且Struts有這麼多年的基礎了,Spring很難取代Struts的地位。這就是先入為主的優秀,一個專案經理選用一種架構,不能單純的從它的技術上考慮,還有開發效率,人員配置等都是考慮因素。但做為研究性的學習,Spring的MVC部份還是蠻有價值的。
三、資料庫層的模板
Spring主要是提供了一些資料庫模板(模板也是一種Java設計模式),讓資料部分的代碼更簡潔,那些try...catch都可以不見了。這個的確是個好東東。
四、AOP
AOP又稱面向方面編程,它的實現原理還是用了反射:通過對某一個種類的方法名做監控來實現統一處理。比如:監控以“insert”字串開頭的方法名,在這種方法執行的前後進行某種處理(資料庫事務等)。但這裡我有一個疑問?不一定所有以insert開頭的方法都是資料庫操作,哪麼當某個insert開頭的方法不是資料庫操作,你又對它進行了資料事務的操作,這樣的錯誤如何防止???我對這方面瞭解不深,還是只知道一個大概。
曾看過一個程式員發出這樣的感慨:“架構一個接一個,學也學不完,而且有必要嗎?這樣一層層的加上架構,還不如直接寫JSP來得直接,效率還高”。我想這種困惑很多人都有吧?但如果你經過的項目漸多,就會發現,維護項目要比開發項目更艱難,代價更大。那種用JSP直接來寫,層次又不清楚的開發,往往最後得到一個不可再修改的軟體,一團亂麻,移一發而動全身。但軟體不象電視機,做好了就不會改動了,軟體是一個變化的事物,使用者的需求隨時會改變,這時你會體會到分層和使用架構的好處了,它們為你做了軟體中很多和業務無關的工作,你可以只關注業務,並減少代碼量。唯一缺點就是有一個學習的代價,架構配置上也較麻煩。
學習架構,我認為應該:第一步,瞭解這個架構中的一些關鍵概念,它的具體含義是什麼。第二步,瞭解這個架構的精華在哪裡,它能對開發起到什麼樣的作用,最好能對它的原理有一定的瞭解。第三步,用這個架構來寫幾個例子,實際體會一下。我現在還是剛剛大概完成了前兩步,這幾天會再看看Spring的文檔並用Spring寫幾個例子,到時一起發出來。
另外,很讚賞<Spring開發指南>的作者夏昕的觀點,將自已的經驗寫成文檔公開出來,不過一個人的力量終究太弱。最好能夠形成一個組織,對一種新技術,由一兩個人出一個大綱,大家把它分了,更寫一章,然後由兩三個人總集起。我個人感覺,由於英文語言的關係,新技術引進到國內的還是太慢了,至少要比國外慢上一年以上,成立一個開來源文件組織還是很有意義的事。