我為何停止使用Spring

2021-06-19 22:30:23 字數 2370 閱讀 2658

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

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

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

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

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

marc stock說到:

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

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

文中提到「同時,我發現依賴注入文化對重用性有更強的偏愛,不過重用會引入耦合。如果模組a重用了模組b,那麼我們就說模組a與模組b是耦合的」。這裡需要對「模組」做一些澄清。介面會幫助我們更好地理解。在重用時,使用的是spring、cdi還是你自己的什麼東西並不重要。你提到「spring文化」,是真的麼?舉個例子,使用(c3p0)資料來源與platformtransactionmanager(jpatransactionmanager)來配置乙個jpa entitymanager(factorybean)。這裡會有大量的重用,不過解耦性卻很不錯。你可以將jpa切換到hibernate,也可以將c3p0卻換到其他資料來源,還可以將transactionmanager切換到hibernate或是jta的。
manuel rascioni說到:

這幾天我一直在思考是否該使用spring,現在我覺得使用是值得的。看看整個(web)應用,你需要這些東西:乙個依賴注入管理系統、乙個持久化框架、在各個層之間轉換物件的東西、乙個安全框架與乙個aop系統(管理事務、安全等東西)。你有多種選擇,也可以自己建立。如果使用現有的,那需要注意的就是不同框架的整合;如果自己建立,那就需要自己編寫大量**。我的經歷告訴我使用spring可以很好地解決這些問題。它不僅僅是個依賴注入框架,還是一套完整的框架生態系統,可以實現元件之間的解耦,同時又很好地實現了這些框架之間的整合。對於測試來說,我使用mock框架進行單元測試,而沒有使用spring(對於單元測試來說它太慢了)。對於整合測試來說,我們需要使用spring配置檔案。因此,根據我的經驗來看,使用spring是值得的。關於文中提到的耦合,如果模組c需要模組a的一些東西,你是怎麼解決的呢?難道是編寫乙個新的模組,然後複製模組a麼?這完全違背了dry原則吧。

我為何入行

我為何入行 製作一款網路遊戲,使人們樂於參與其中並津津樂道,是支配我入行的單純而強烈的動機。這種不可遏制的造物主般的感覺,宛如颶風,席捲著我略過種種選擇,直抵網遊開發的殿堂。對業內成功產品的體驗,玩家對鍾愛遊戲的狂熱,總是引領我到美好的境界。可公司無願景的研發,曠日持久的進度拖延,生活中逐日浮出的問...

我為何拒絕」考研」

我為何拒絕 考研 文 飛天含雪 大三末,幾乎所有的大學生分化成兩個 種族 1.考研一族2.就業一族.這兩個種族無論在學習還是生活上都可謂 涇渭分明 有著 天壤之別 考研一族 懸梁刺股 拼命做題應考,而就業一族則 馬不停蹄 趕赴各個招聘會.兩者雖方式不同,情況各異,不論怎樣,都是在為了自己的美好未來 ...

我為何而生 英 羅素

對愛情的渴望,對知識的追求,對人類苦難不可遏制的同情,是支配我一生的單純而強烈的三種感情。這些感情如陣陣颶風,吹拂在我動盪不定的生涯中,有時甚至吹過深沉痛苦的海洋,直抵絕望的邊緣。我所以追求愛情有三方面的原因。首先,愛情有時給我帶來狂喜,這種狂喜竟如此有力,以致使我常常會為了體驗幾小時的愛的喜悅,而...