Spring--也許正成爲一個EJB

我在想,如果我開始的時候,換個名字,比如說“Spring被嚴重濫用”或者是“大家使用Spring時,經常誤解了面對接口編程這個概念”,可能會更容易理解一些,可能有些爭吵就是不必要的了。應該算是我的失誤,雖然本意並非標題黨,但還有給人這種感覺。在此說聲抱歉了。

最後算是總結一下吧(包括我自己一開始要表達的內容,以及中間想到的一些內容):
[list]
[*]我不是什麼技術牛人,也從來不敢說自己在哪方面有所擅長,所以我討論問題的時候,很少用絕對來肯定或者否定某些內容或者觀點,因爲我的角度永遠只是片面的。很多支持Spring的人,因爲他們可能用得非常正確,也的確簡化了他們的工作,自然是認可的。而反對Spring的人,可能是沒有用好,或者用得場合不正確,所以也就反對了。所以支持者和反對者之間並不見得有什麼矛盾,更不必言語上有太多的相互冒犯。將自己的立場和場景講清楚,可能會更好。
[*]我從來沒有說過Spring沒有用,也沒有建議大家不用Spring,我只是強調在使用Spring的時候,多多思考,不要教條化。事實上,對於事務,Proxy,還有很多助手類,我也很喜歡用。我對Spring提出的問題在於,它的IOC方式太容易被濫用,當然是否有更好的方案,我也不確認。但這並不妨礙我提出問題。我也說了IOC有很多種方式,Spring的只是一種,大家可以跳出去看一下,學習一些新東西,絕非壞事。
[*]主要問題在人,而不一定是技術,Spring也好,EJB也好,都有自己的場合。高手可以用很簡單的架構解決很複雜的問題,同樣給低手一個再好的架構,也能做爛一個項目。但是Spring在宣傳,或者設計上容易讓別人誤用(也可能是大量不嚴謹的例子引起的,我經常回頭看自己寫的一些東西,也會發現當時只是就問題談問題,給出了一些例子,還是容易誤導的)。所以我也一直強調,不能不分場合的濫用,如果這樣,那麼不管Spring,還是EJB,都存在問題。
[*]面向接口編程這個問題,也沒有必要細討論,提出來,供大家參考就OK了。
[*]至於我提到的這些問題,都是可以解決的,這個我是同意的,我也提了一些思路,如Spring更合適做模塊,模塊間可以通過其它的方式來交互,又或者模塊間的Spring Context和模塊內的Spring Context相互隔離。當然更希望大家能有更好的建議。
[*]再加一句,我只希望做技術的人,在使用框架的時候,都有自己的思考,不僅僅是怎麼完成工作,更想知道爲什麼這樣做,還有沒有更好的方式。我也理解,在中國,深入做技術的確很難,不管是工作壓力,強度,還是整個社會,但是有些事情總還是可以考慮的吧。
[/list]

[b]以下是原來的內容:[/b]
[quote][/quote]本來想註冊一個馬甲來寫這個帖子的,因爲估計自己會被罵得很慘。
但是想想還是認了吧。
[b]說個額外的話,大家如果分別看一下支持和反對者說話的語氣,就會覺得蠻好玩的。[/b]

我不善於寫長文章,就簡單的說一下自己的看法吧:
[list]
[*]依賴注入並不是不好,但Spring的依賴注入並不是很好,因爲他要強迫很多人員瞭解別人的東西(你現在要用別人的一個接口,需要配置Spring,那麼你必然要找到該接口的實現類,甚至是多個實現類,需要了解別人內部的東西,這叫解耦嗎),特別是開發人員水平不高的情況下,基本上就是爲了注入而注入,爲了接口而接口。
[*]Spring更合適在模塊內部使用,但現在大部分開發人員都做不到模塊化設計,而Spring大量的配置文件,將相關內容全局化了,進一步破壞了模塊化設計的可能。
[*]Spring的配置文件太多,而且基本上現在web開發中,都是全局化的,再加上autowire,維護難度遠遠大於代碼。
[*]減少了靜態編譯的機制,增加了不必要的錯誤。
[*]佔個位,慢慢補充。
[/list]
當然有人說,是很多人沒有用來Spring,事實上,EJB也是這樣,不是EJB不好,而是EJB沒有被用好。
就好象API的設計,如果你設計了一個API,卻很容易讓人誤用(或者是進行了錯誤的宣傳),那麼責任是使用者還是開發者呢?

大概在7年前,我就不太認同Spring,當然Spring不會因爲我的不認同而停止,7年後,情況似乎更嚴重了。
當時我在CSDN上寫的一個Blog: [url]http://blog.csdn.net/wl_95421[/url]
我現在仍然想問一個問題:配置文件真的比代碼更容易維護嗎?

另外說一句,我反對Spring的思路,但是也會用到Spring的一些功能包,比如Jndi的封裝等。

估計很多人不同意我的意見,不過希望大家靜心討論一下。

另外說一句,“面向接口編程”,這話裏的接口不是java的interface,如果真正翻譯一下,應該是“面向抽象編程”,也就是說,將功能抽象出來,然後通過對外的內容提供功能,至於對外的內容是interface,還是class,要看具體的情況。
不是說我寫了一個接口,再寫一個實現類,就變成“面向接口編程”。
所以也提醒大家注意,回頭看一下自己的代碼,是否真地對自己的功能進行抽象了,如果說從interface中看出了非常具體的功能,那麼這個interface其實就沒有什麼意義。


我來回答一下問題吧:

[quote]Spring完全沒有強制你如何寫代碼[/quote]
是否強制,這個很難說。仍然是那個建議,java.util.ServiceLoader和Spring兩種注入方式,哪種更容易誤用呢?一個框架多少都會對使用者施加一定的影響,說沒有強制是不大可能的。
問題不在於強制於否,而是在接受的同時,要有自己的思考。
比如說,這種問題Spring有一種解決方式,那麼有沒有別的方式,思考之後,覺得沒有,OK,繼續用Spring,如果有,嘗試用一下別的內容,也學到了東西,有什麼不好呢?但現在這種情況不太普遍吧。

[quote]也沒看出來你有啥有建設性的建議[/quote]
我提一個建議,不一定說好,供參考。
將一個大項目分成多個模塊項目,模塊項目間不使用Spring組裝,每個模塊都自己清楚的對外功能入口。然後模塊內部的Spring文件對外屏蔽,不要外部修改。這樣外部使用一個模塊的時候,無須去了解Spring文件,而且每個模塊內部使用一個相應的ApplicationContext,不會項目所有的模塊共享一個Context,可以適當地減少混亂。
當然Spring-DM也有這部分思想的體現,只不過它當時更多是爲OSGi來做。
又說到老的話題,Spring也有很多好東西,但好東西往往沒有被用好,反而是被用爛了。

[quote]如果without spring,你有更好的方案嗎?沒有,那就接着用吧。 [/quote]
[quote]難道兄弟你有更高明的方案?如果沒有,請不要亂說![/quote]
這句話其實沒有意義,每個技術都有適用的場景,有些場景下用Spring也是合適的,但是我看到的情況都是在濫用。爲一個功能寫一個接口和一個實現類,然後就認爲是面向接口編程。這種思路怎麼來的,真正用的好嗎?我是比較懷疑的。
如果說到方案,只能具體化,打個比方,JDK的ServiceLocator也是非常強大,同時也很簡單的。用他同樣可以解決很多問題,NetBeans的Lookup也很簡單,同樣支持了NetBeans。


[quote]多麼令人蛋疼的觀點,發言要靠事實依據,你有證據證明ejb是因爲沒有被用好才淘汰的嗎[/quote]
EJB一開始就主要目的是爲了分佈式功能來做的,在當時是沒有什麼問題的。但在當時有多少項目需要用到EJB呢,很少,但大家提到分佈式,就覺得是EJB,本來就是誤用。那時候,幾乎是言必談EJB和分佈式。
EJB沒有被完全淘汰,有很多場合還是用得不錯,這些例子我就不用舉了吧,只不過90%的情況下是被誤用的。

[quote]我沒投新手,也沒投隱藏。但我是爲spring叫好的人。你怎麼就那麼確定爲spring叫好的就一定是新手?你怎麼就知道人家沒有對歷史比較? [/quote]
我不知道爲什麼說Spring不好,就有人說我水平差,我是混過來的,沒有經驗裝經驗,有邏輯關係嗎?
就算上面是真的,我一定是年輕人嗎?無語的邏輯。

[quote]真的不知道你是怎麼混過來的。估計也是沒什麼經驗的裝有經驗吧,我真的很氣憤你們這些人,本來沒經驗就不要裝。好像自己其實什麼都懂的樣子。年輕人不要太浮躁。[/quote]
我對這話也比較無語了,我雖然不是什麼大牛,但代碼方面應該也不算太差了。
另外我33歲,不算年輕人了。

[quote]個人看JSP真的應該要淘汰了,JSF纔是下一個J2EE的領主。讓J2EE開發變的更加快捷和高效 [/quote]
至於JSF,我不是特別瞭解,不好評價。但我也不認爲它會是下一個J2EE的領主。

[quote]小弟經驗不高。但是我想說。天底下沒有完美的程序,是程序就有BUG。所以至於任何框架都有 有點,缺點,沒有什麼淘汰之類的說法。[/quote]
問題是目前看過來,Spring基本是被濫用,書上給出的例子都往往比較教條,大家照抄,結果不用說了。
當然淘汰這個詞用得不是很合適吧,每種技術都有場景,就象cobol多年來還是在用。


[quote]佔位,我覺得spring挺好的,能解決掉我們開發中的很多問題,減化我們的工作量。我們只用它的core部分就行了,其它你可以不用。如果without spring,你有更好的方案嗎?沒有,那就接着用吧。[/quote]
我沒有說用還是不用Spring的問題,我只是說Spring現在被嚴重誤用,快成了第二個EJB了。

[quote]沒辦法火了 這種人太噁心了,貶低別人擡高自己,不懂技術非要裝懂。如果他真有本事 你就別用Spring [/quote]
評價一個東西的好壞,和用不用這個東西沒有必然聯繫吧。
我一直在強調誤用纔是最根本的問題,不是說用不用的問題。

[quote]乍一看標題,正想一笑了之,忍不住好奇點開帖子,盼着或有什麼驚人之論,也未可知。進來看後大失所望。不是說spring不能被批評,只是樓主通篇除了無病呻吟,實在毫無深度,乏善可陳。不過倒是符合JE評良好無好貼的一貫作風。 [/quote]
無病呻吟不敢苟同,我已經在裏面提出了問題,Spring的誤用,帶來了不必要的複雜度,而且目前很多項目中的設計就是爲了接口而接口,我覺得這種情況很嚴重,而且很多人把IOC等同於Spring的注入,事實上還有很多更好的注入方式,如ServiceLocator(Tuscany基於它實現的,應該不算小項目了吧),NetBeans的Lookup也不用說了。
至於很多人說讓我給出一個更好的方案,我的確是沒有辦法。小項目有小項目的做法,大的有大的,產品型的和普通項目也有區別,怎麼可能有一個放之四海而皆準的方案。但現在很多人都認爲Spring就是,這纔是我想說明的問題。
說實話,我也沒有想過去說服別人,只不過正好和一個朋友聊天說到Spring,所以發了這個帖子。
不過結果倒是在我的意料之中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章