3

我想了解春天。我已經讀過它並做了一些教程。我得到了IoC範例,以及DI在Spring中實現它的事實。什麼是不使用春天的問題

我的問題是這樣的:你沒有使用Spring會失去什麼?我明白這是一個很大的問題,有些主觀。但是如果你可以寫出幾個點或者給出一個如果Spring未被使用可能發生的問題的例子,我認爲這會對我和其他許多人有所幫助。

回答

2

實際上沒有問題。但是如果你開始編寫你的代碼,你將最終得到一個像Spring一樣的本地化框架。使用Spring獲得的東西是該框架已經比通用框架更通用了,您可以在很多不同的項目中使用它。最重要的(也許)是Spring已經被很多使用它的用戶測試過了。

當然,你也可以嘗試另一個框架,不只是春天。這裏有很多有...

1

伶牙俐齒的回答是,你必須給它的所有自行編碼。我不知道很多關於Spring(還),但即便而使用Spring,你需要兩個編輯點構造器注入的基本行爲將需要大量的代碼:

在配置:

<sectionGroup name="spring"> 
    <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 
    <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 
    </sectionGroup> 

    <spring> 
    <context> 
     <resource uri="config://spring/objects"/> 
    </context> 
    <objects xmlns="http://www.springframework.net"> 
     <object name="mediaLibrary" type="AlbumLibraryWPF.AlbumLibrary, AlbumLibrary"/> 
    </objects> 
    </spring> 

在代碼:

IApplicationContext ctx = ContextRegistry.GetContext(); 
    library = (Library)ctx.GetObject("mediaLibrary"); 

你應該怎麼做:你自己寫一個DI框架還是專注於構建你的解決方案?

3

春天是遠遠超過只是一個工具的IoC(DAO認爲相關的東西,方便MVC支持,測試工具,...)。在我看來,它逐漸成長爲一種Java的「味道」。但這不是重點:) 說到IoC/DI,你鬆了什麼不使用它是在應用程序中獲得鬆散耦合的最簡單方法,這與可重用性有關。很顯然,大多數人傾向於考慮另一個項目中組件的可重用性,這在我的經驗中並不常見。當你必須對你的代碼進行單元測試時,會出現重用性最大的好處。 編程通過使用DI接口 /國際奧委會做出單元測試那麼容易,即使是那些誰也不願意單元測試將開始愛它。在UT的事

鬆耦合和收益是一件事,你將失去。

0

的IoC主要是Java語言,因爲當大多數應用程序開始生長,你不設計一個模塊化/鬆耦合,你最終互聯類的一大堆沒有沒有合理的範圍內是一件好事。

對於初學者來說,春節和其他的IoC/DI框架,讓你覺得從一開始模塊化權利。這很重要,因爲如果你的代碼很好地模塊化/鬆散耦合,那麼你最終會進行組件化和重用,從而導致更好的單元測試(無論如何你都要進行單元測試)。

如果我想編寫一個DAO,我可以定義它的接口前面:

interface IPersonDao { 
    List<Person> getPersonsByTeam(String teamName); 
} 

然後,我可以要求從SRC哪來春的任何地方這個接口的實現正在「應用」。假設我需要它在服務層:

class MyService { 
    @Autowired 
    IPersonDao svc; 
} 

或在測試類:

class TestPersonDao { 
    @Autowired 
    IPersonDao svc; 

    @Test 
    void testGetPersons(){ 
    List<Person> persons = svc.getPersonsByTeam("billing"); 
    Assert.assertDataSet(persons, "billing.xml"); 
    } 
} 

此外,我的DAO實現可以隱藏數據訪問的複雜性不與道合同搞亂。如果我需要一個Hibernate的Session或持久性管理器,我只是宣佈:

class JpaPersonDao implements IPersonDao { 

@PersistenceContext 
EntityManager em; 

    List<Person> getPersonsByTeam(String tm) { 
    em.createQuery("..."); 
    } 
} 

組件化的類要求以電匯合作豆註冊表。這可以通過手工開發,但已經有DI框架可以做到這一點。此外,Spring還有很多其他的東西,比如異常轉換,對方面編程的支持,mvc框架,portlet框架,與hibernate的集成,jpa和/或其他db堆棧,當然這些與Spring IoC的東西很好地集成在一起。

1

春天不僅僅是一個DI框架。還有很多,這將使你編程更容易地區:

  • JDBC,Hibernate中,JMS模板(大大減少代碼行數)
  • 看點編程
  • 安全(春季安全)
  • 春天MVC
  • 的Spring Web服務

這些只是一些例子 - 還有更多。你不必使用上面的任何一個,但是有一個成熟,設計良好的框架的一部分,通常它們使事情變得更簡單。

Spring的核心當然是依賴注入。對於小型項目,使用DI框架的好處可能並不明顯,但對於大型複雜項目而言,這一點並不明顯。 Martin Fowler非常清楚地解釋了Inversion of Control。當然還有其他的選擇(例如Guice),但我會說Spring現在是一個行業標準。

+0

我也從Ruby on Rails背景學習Spring,並且對Spring解決的問題印象深刻。 微軟世界正在做什麼?他們也有這樣的框架嗎?有NHibernate,但有官方的NSpring或者任何這樣的計劃? – 2009-04-25 05:35:49

2

我寫了一篇關於爲什麼人們使用依賴注入框架(如Spring和Google Guice)的說明。大多數教程忽略了這一點,但恕我直言,這是最重要的事情。

如果您瞭解您遇到的問題以及所有這些模式/框架解決的問題,那麼您才能夠製作出優秀的軟件和優秀的架構選擇。

讀到它在這裏:http://www.redcode.nl/blog/2010/01/dependency-injection-dissection

2

簡單地說,你申請依賴注入編寫乾淨,可測試的代碼。同樣作爲回報,你實現了一個設計,調用者知道使用哪個實現(注入)而不是被調用者(這就是着名的「好萊塢原則」)。現在如果你不使用像Spring和Guice這樣的使用DI框架,你可以嘗試使用工廠來實現依賴注入。但是,測試時,工廠會花費代碼樣本和不安的清理。有些人還在這些框架中發現了其他優勢,這些優勢是它們與屬於Struts,Hibernate等不同層的框架的輕鬆集成。