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