我為何停止使用 Spring

jopen 10年前發布 | 10K 次閱讀 Spring

Johannes Brodwall是 一位程序員、解決方案架構師、用戶組與會議組織者、會議演講者與布道師。Johannes一直在不遺余力地將敏捷原則應用到大型軟件項目中,不過他真正感 興趣的是與全世界的程序員分享更多關于編程的有趣經驗。目前,Johannes就職于Exilesoft,擔任首席科學家一職。近日,Johannes撰 寫了一篇關于他為何停止使用Spring的文章,在程序員群體中引起了很大的反響。

我之前發表的一篇題為謙卑的架構師的 文章引起了很多爭論,特別是Spring與依賴注入框架這個話題,這次我打算來談談為什么我要停止Spring。我是挪威最早采用Spring框架的一批 人。我們在開發一個大型系統時最后不得不考慮諸如如何重用XML配置文件的各種不同機制等問題。最后,這演變成了@Autowire與 component-scan,這種方式解決了大量配置文件的難題,不過卻降低了人們了解全部源代碼的能力,這直接導致開發者被限制在應用中非常小的部分 代碼中。隨著應用變得越來越復雜,文化、工具、文檔等東西導致開發者們不得不在一個個不必要的層次上構建另外一些不必要的層次。

不久之后,我嘗試在不使用依賴注入框架的情況下來構建應用,不過這引發了另外一些問題,那就是何時該使用“new”呢、何時使用setter或是構造器參數呢,哪種類型適合作為依賴呢、哪些東西導致了對基礎設施的耦合呢。

根據直覺我發現DI框架確實能夠幫助我改善設計,不過與此同時,我還發現在離開容器時,解決方案變得更小(這很棒!)、理解起來更簡單,并且易于測試。這 讓我感到進退維谷,我發現使用容器的代價是非常高的,它會不斷增加復雜性與規模,同時會降低一致性。不過話又說回來,它教會了我一些更棒的設計技巧。</p>

總的來說,我個人認為一致、小型的系統要比那些為了解耦而解耦的系統更有價值。一致性與解耦是對立的,我站在一致性這一邊。同時,我發現依賴注入文化對重 用性有更強的偏愛,不過重用會引入耦合。如果模塊A重用了模塊B,那么我們就說模塊A與模塊B是耦合的。模塊B中的變化可能會對模塊A產生更好(修復 Bug)或是更糟(引入新的Bug)的影響結果。如果重用所帶來的好處更多,那就值得使用;否則就不值得。因此,重用與解耦是對立的兩個方面,我自己更偏 向于解耦。如果出現沖突,我個人認為優先級應該是一致性大于解耦,解耦大于重用性,而Spring的基因似乎與此相反。</p>

Johannes的文章發布后,旋即引起了程序員社區的激烈討論,有些討論也很有意思,下面摘錄幾篇:

Marc Stock說到:

如果使用Spring的依賴注入增加了系統的復雜性,那么問題的癥結在于你自己。我使用Spring有好幾年的經歷了,它總是讓事情變得更棒和更整潔。我 不敢說所有的Spring項目都是這樣,不過對于依賴注入來說絕對沒錯。也就是說,我發現有很多使用Spring的方式值得商榷,事實上他們做的很多事情 都是不必要的(不過他們卻并不這么認為)。如果你能舉出Spring依賴注入會引起混亂的例子,我愿意拭目以待。</blockquote>

Johannes Brodwall說到:

文章的質疑很不錯。我來舉個簡單的例子,假如一個系統有很多層次,所有東西都被加上了@Autowire與component-scan。我嘗試實例化其 中的某些服務,不過卻缺少依賴。最后只能將所有的依賴加進來來實例化測試中所需的一個簡單服務,因為查找存在哪些依賴、應該使用哪些依賴來作為模擬花費了 我大量的時間。</blockquote>

Hendy Irawan說到:

文中提到“同時,我發現依賴注入文化對重用性有更強的偏愛,不過重用會引入耦合。如果模塊A重用了模塊B,那么我們就說模塊A與模塊B是耦合的”。這里需 要對“模塊”做一些澄清。接口會幫助我們更好地理解。在重用時,使用的是Spring、CDI還是你自己的什么東西并不重要。你提到“Spring文 化”,是真的么?舉個例子,使用(c3p0)數據源與 PlatformTransactionManager(JpaTransactionManager)來配置一個JPA EntityManager(FactoryBean)。這里會有大量的重用,不過解耦性卻很不錯。你可以將JPA切換到Hibernate,也可以將 c3p0卻換到其他數據源,還可以將TransactionManager切換到Hibernate或是JTA的。

你討厭XML配置,也 討厭@Autowired,不過配置總歸是要有的。如果喜歡set或是new的方式,那么你可以使用注解,文中并沒有提及這一點。如果使用的是CDI,那 么討厭@Autowired/@Inject有情可原,不過這是Spring,你有很多選擇。根據我的經驗,對于后端服務綁定使用注解配置,對于UI組件 使用@Inject會更好一些。我們也不使用XML,你可以嘗試一下這種方式。</blockquote>

Manuel Rascioni說到:

這幾天我一直在思考是否該使用Spring,現在我覺得使用是值得的。看看整個(Web)應用,你需要這些東西:一個依賴注入管理系統、一個持久化框架、 在各個層之間轉換對象的東西、一個安全框架與一個AOP系統(管理事務、安全等東西)。你有多種選擇,也可以自己創建。如果使用現有的,那需要注意的就是 不同框架的集成;如果自己創建,那就需要自己編寫大量代碼。我的經歷告訴我使用Spring可以很好地解決這些問題。它不僅僅是個依賴注入框架,還是一套 完整的框架生態系統,可以實現組件之間的解耦,同時又很好地實現了這些框架之間的集成。對于測試來說,我使用mock框架進行單元測試,而沒有使用 Spring(對于單元測試來說它太慢了)。對于集成測試來說,我們需要使用Spring配置文件。因此,根據我的經驗來看,使用Spring是值得的。 關于文中提到的耦合,如果模塊C需要模塊A的一些東西,你是怎么解決的呢?難道是編寫一個新的模塊,然后復制模塊A么?這完全違背了DRY原則吧。</blockquote> 作者:張龍  來源:infoq

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!