在這里,SPRing指的是Spring開發框架,一種依靠注入容器的實現。首先,我聲明我沒有一點冒犯Rod的意思(你是個優秀的人)。但是坦白地說,我不能狂熱的追隨您的開發框架。更為嚴重的是,我注重到,我所考慮的這些可能對于Spring框架的使用率來說是危險的,并且有可能降低對Spring框架的使用率。我讀到一個關于Spring的很重要的文章或書籍,看起來似乎除了我,所有的人都喜歡Spring。但是我有什么損失嗎?可能采用Spring是J2EE一個類似“膝跳反射”的事情(這種事情可以不經過大腦)?!癑2EE不是好東東,Spring的人說他們的產品更好一些,所以Spring一定是好的”但是事情并不是那樣的。
第二點,我僅僅討論Spring,而不討論依靠注入。我喜歡依靠注入,并且天天都使用它。它是一個擺脫service locators的好方法。
我記不得有多少次有開發者對我說,“我的上一個項目使用了Spring,這個框架真好”。但是沒有人能清楚明白的說出他們究竟喜歡Spring的哪一點,Spring到底幫助了他什么。所以我敢說,他們喜歡setter注入,這使得他們的代碼更加靈活和可測;但并不一定必需Spring。我猜有些人并沒有徹底理解依靠注入,所以他們依靠Spring來幫助(或者強迫?)他們使用依靠注入。然而,這種好處并沒有在量上大于Spring在你的代碼上帶來的負面影響,這些負面相應在下面的清單上。
Spring的狂熱者公開的指責J2EE,但是從他們的指責中,我可以說,Spring實際上既不是輕量級也不簡單。
javadocs未必是必要的,但是這一切都要怪罪于一個用戶API嗎?最起碼J2EE清楚的將API和它們的實現分離開來。Spring的鼓吹者吹捧Spring不會“動”你的代碼,例如,你不必去實現任何的Spring指定的接口(生命周期接口除外等等)。新聞特寫,“
xml配置文件是我們自己的代碼,通過它,我們能組織起很多的代碼,這些代碼都是Spring給定的”
為什么我一定要把我所有的依靠使用XML文件來表達?我是需要把我所有的對象都用Spring來處理,還是僅僅一些沒有考慮成熟的?上面我所說的這些問題,Spring文檔沒有給出一些可靠的答案,而且所有的Spring書籍也沒有給出。我假定我們使用Spring是為了產生所有的對象。那么這樣還是我們喜歡的Java編程嗎?我希望在編譯期和隨后的裝載期能夠確定這些對象,而不是在運行我的代碼的時候才能夠確定。Spring能做到支持這些嗎?
很明顯,我希望裝載一些像JDBC驅動這樣的動態實現的依靠(即不要求編譯期的檢測);但是在我的系統中,這樣的依靠只是一小部分;而剩下的部分,我們代碼的絕大部分卻不是。我是在使用一種強類型的語言。假如我希望像Spring那樣,我會使用Ruby。難道Spring的配置文件不像是我們在猜測著將Java代碼寫入XML文件里嗎?難道那些使用Spring的開發者使用起Java來不那么舒適?我確信增加了一個XML層并不能使得代碼變得哪怕是一點點簡單。
現在回過頭來談談關于對Spring API的依靠的問題。我不得不調用容器來產生我的第一個對象(假定剩下的Spring治理對象是注入的),不是嗎?我需要一些方法在編譯期間來測試我所請求的對象是正確的類型;我不想靠拋出違例的方法。究竟,我真的需要一個容器嗎?在Spring里,你通過使用一個唯一的ID來獲取對象。我假定大部多數的開發者在他們Java代碼里使用一個String類型的常量來定義他們的ID。Spring并不能幫助我使得我的Java代碼里的ID值和我的XML文件里的ID值保持一致。當一個對象已經夠用了的時候,為什么要使用兩個對象?是否我們真的把所有的信息組織到一起放到了容器里?是Java的包和類不夠用了嗎?
還有一個困擾我的問題是,在我的XML配置文件里,我不得不引用Spring實現的類,我不想管這些東西。在Spring的計劃里,我聽說更加簡單的、域范圍的XML將在2.0版本中被使用,但是我到現在還沒有看到。為什么這些不能早一點被采用呢?
什么繼續上的東西啊?關于超常類名置換的變換。但這些都不是我的風格。
Spring在哪里支持了JDK1.5的泛型?我知道你有很多客戶運行在JDK1.4甚至JDK1.3的版本上,但是這和JDK1.5沒有分歧啊。泛型打開了通向像這種框架的各種各樣的可能性的大門。這些是我最喜歡的JDK1.5的新特性,擁抱這些新特性吧!
你曾經看過每次你產生一個對象Spring要做多少事情嗎?我需要在運行期內有少量的instanceof,而大多數是在裝載期的Class.isAssignableFrom()。不是因為內部的實現給最終用戶帶來了很多的麻煩,而是因為把它作為了一個測試框架剩下部分質量的試金石。一個好的對于bean的創建渠道的重構將會很輕易的被遵循和產生更加高質量的代碼,并且不需要求助于更多的繼續就能被重用。
Auto-wiring也有同樣的問題。每一個人真的在使用它嗎?或者是為未來的重要功能的一個鋪墊?