java - Spring框架到底是什麼?


我聽到很多關於Spring的信息 ,人們都在網上說Spring是一個很好的Web開發框架。 Spring框架到底是什麼? 我如何將它用於我的Web-Java應用程序開發? 任何例子?




Answers


基本上Spring是一個依賴注入的框架,它允許構建非常分離的系統。

問題

例如,假設您需要列出系統的用戶,並聲明一個名為UserLister的接口:

public interface UserLister {
    List<User> getUsers();
}

也許一個實現訪問數據庫來獲取所有的用戶:

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

在你看來,你需要訪問一個實例(只是一個例子,記住):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

請注意,上面的代碼沒有初始化變量userLister 。 我們應該做什麼? 如果我像這樣顯式實例化對象:

UserLister userLister = new UserListerDB();

...我將這個視圖與我的實現訪問數據庫的類相結合。 如果我想從DB實現切換到另一個從逗號分隔的文件中獲取用戶列表(請記住,這是一個例子)? 在這種情況下,我會再次去我的代碼,並通過更改最後一行:

UserLister userLister = new UserListerCommaSeparatedFile();

這對於像這樣的小程序來說沒有問題,但是......在一個有數百個視圖和類似數量的業務類的程序中會發生什麼。 維護成為一場噩夢!

Spring(依賴注入)方法

Spring所做的是通過使用XML文件連接類,這樣所有的對像都被Spring實例化和初始化,並被注入到正確的地方(Servlets,Web Frameworks,Business classes,DAO等等等等。 )。

回到Spring中的例子,我們只需要為userLister字段設置一個setter,並使用這樣的XML:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

這樣當視圖被創建時, 神奇的將會有一個UserLister準備好工作。

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

太好了! 不是嗎?

  • 如果你想使用你的UserLister接口的另一個實現呢? 只需更改XML
  • 如果沒有UserLister實現準備好會怎麼樣? UserLister的時間模擬實現並簡化視圖的開發
  • 如果我不想再使用Spring,該怎麼辦? 只是不要使用它! 您的應用程序不耦合到它。 控制反轉狀態:“應用程序控制框架,而不是框架控制應用程序”。

除此之外,還有其他一些依賴注入的選擇,除了簡單性,優雅性和穩定性之外,我認為Spring已經非常出名了,SpringSource的編程人員編寫了許多POJO,這些POJO幫助將Spring與許多其他常見框架集成在一起,侵入您的應用程序。 另外,Spring還有幾個很好的子項目,比如Spring MVC,Spring WebFlow,Spring Security,還有一些其他的等等。

希望這可以幫助。 無論如何,我鼓勵你閱讀Martin Fowler關於依賴注入和控制反轉的文章 ,因為他比我更好。 在了解基礎之後,看看Spring Documentation ,在我看來,它曾經是有史以來最好的Spring書籍。




Spring 包含正如Skaffman正確指出的 )一個MVC框架。 簡而言之,這裡是我的投入。 Spring支持服務層,Web層和業務層的分離,但實際上最擅長的是注入對象。 所以用一個例子來解釋下面的例子:

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

現在在你的代碼中,你有一個名為RoadTrip的類,如下所示

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

現在,每當你想要一個Trip的實例; 有時你可能想要一輛SUV來初始化FourWheel或者有時你可能需要四門轎車。 這真的取決於你想要根據具體情況。

為了解決這個問題,你希望有一個工廠模式作為創建模式。 工廠返回正確的實例。 所以最終你會得到大量的膠水代碼來正確地實例化對象。 春天沒有膠水代碼最好的膠水代碼的工作。 您聲明XML中的映射,並自動初始化對象。 它也使用單例體系結構的實例很多,這有助於優化內存使用情況。

這也被稱為控制反轉。 其他的框架是Google guice,Pico容器等。

除此之外,Spring還有驗證框架,與JDBC,iBatis和Hibernate(還有更多)協作,對DAO層提供了廣泛的支持。 對數據庫事務提供卓越的事務控制。

春天有很多東西可以在“Pro Spring”這樣的好書中讀到。

以下網址也可能有幫助。
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework




什麼是春天? 我很快就會回答這個問題,但首先讓我們再來看一下維克托·胡戈的例子。 這不是一個很好的例子,因為它沒有理由需要一個新的框架。

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

完成! 所以現在,即使你有成百上千的視圖,你仍然只需要改變一行代碼,就像在Spring XML方法中一樣。 但改變一行代碼仍然需要重新編譯,而不是編輯XML,你說? 那麼我的挑剔的朋友,用螞蟻和腳本!

那Spring是什麼? 這是為了:

  1. 盲人開發者遵循這個群體
  2. 雇主誰也不想僱用研究生程序員,因為他們不在Uni教這樣的框架
  3. 以糟糕的設計開始並且需要拼湊的項目(如victor hugo的例子所示)

進一步閱讀: http : //discuss.joelonsoftware.com/?joel.3.219431.12




過去, Spring只是一個像( GuicePicoContainer ,...)這樣的依賴注入框架工作,但現在一天它是一個為您構建企業應用程序的總體解決方案。

春天依賴注入,當然是春天的心臟仍然存在(你可以在這裡查看其他好的答案),但是從春天還有更多...

Spring現在有很多項目,每個項目都有一些子項目( http://spring.io/projects )。 當有人談到春天的時候,你一定要搞清楚他在說什麼春天的項目 ,是春天的核心, 春天的春天 ,還是春天的項目。

一些值得一提的春季項目是:

如果您的應用程序需要更多的指定功能,您可能也會發現:

  • 彈簧批量框架設計,使開發
    批量應用
  • spring HATEOAS基於HATEOAS主體輕鬆創建REST API
  • 用於移動應用開發的spring mobilespring andriod
  • 彈簧殼構建一個全功能的shell(aka命令行)應用程序
  • 春天雲春天雲彩數據流為雲彩應用

那裡也有一些小項目,例如spring-social-facebookhttp://projects.spring.io/spring-social-facebook/

您可以使用spring來進行Web開發,因為它具有Spring MVC模塊,這是Spring MVC 框架項目的一部分。 或者你可以使用其他web框架的工作,如struts2




總結很簡短,我會說Spring是你應用程序中的“膠水”。 它被用來集成不同的框架和你自己的代碼。




春天是三件事。

  1. Spring處理依賴注入,我建議你閱讀Martin Fowler關於依賴注入的優秀介紹。
  2. Spring所做的第二件事就是在您的應用程序中使用非常優雅的方式封裝出色的Java庫。 看一個很好的例子,看看Spring如何包裝Task Executors和Quartz Scheduler。
  3. 第三,Spring提供了大量的REST,MVC Web框架等網絡實現。 他們認為,因為你使用Spring的前兩個,也許你可以使用它的一切你的web應用程序需要。

問題在於,Spring DI是真的被深思熟慮,其他東西的包裝真的很深思熟慮,其他東西都想出來,Spring很好地包裝它。 MVC和REST的Spring實現和其他所有的東西都沒有完成(YMMV,恕我直言),但也有例外(Spring Security是da bomb)。 所以我傾向於使用DI的春天,它的酷包裝,但喜歡其他東西的網絡(我喜歡Tapestry很多),REST(澤西島是非常強大的),等等。




使用Spring的Web應用程序可能需要什麼 -

  • 使用2.5+的Spring MVC允許您將POJO用作Controller類,這意味著您不必從任何特定的框架(如Struts或Spring 2.5之前的版本)中進行擴展。 控制器類也很難測試,部分依賴於依賴注入
  • Spring與Hibernate集成在一起,它很好地簡化了ORM解決方案的工作(對於大多數情況)
  • 使用Spring的Web應用程序,可以在應用程序的所有級別使用您的域對象 - 使用Hibernate映射的相同類是您用作“表單bean”的類。 從本質上講,這將導致一個更強大的領域模型,部分原因是它將減少類的數量。
  • Spring窗體標籤使得創建窗體變得更容易,沒有太多的麻煩。

另外,Spring是巨大的 - 所以在Spring AOP或Spring Security等Web應用程序中,您可能會感興趣的還有很多其他的東西。 但上面列出的四件事情描述了在Web應用程序中使用的Spring的常見組件。




我看到這兩個部分:

  1. “春天到底是什麼” - >見維克托·胡戈接受的答案。
  2. “Spring是一個很好的Web開發框架” - >人們說這是在談論Spring MVC。 Spring MVC是Spring的許多部分之一,是一個使用Spring的一般特性的Web框架,就像依賴注入一樣。 這是一個非常通用的框架,它是非常可配置的:您可以使用不同的數據庫層(Hibernate,iBatis,普通的JDBC),不同的視圖層(JSP,Velocity,Freemarker ...)

請注意,您可以在不使用Spring MVC的情況下,在Web應用程序中完美地使用Spring。 我會說大多數Java Web應用程序這樣做,而使用像Wicket,Struts,煤層等其他Web框架...




Spring非常適合將類的實例粘合在一起。 你知道你的Hibernate類總是需要一個數據源,Spring把它們連接在一起(也有一個數據源的實現)。

您的數據訪問對象將始終需要Hibernate訪問,Spring會將Hibernate類連接到您的DAO中。

此外,Spring基本上為您提供了一堆庫的可靠配置,並在這方面為您提供了有關應該使用哪些庫的指導。

Spring是一個非常棒的工具。 (我不是在談論Spring MVC,只是基礎框架)。







優點是依賴注入(DI) 。 這意味著外包創建對象的任務。讓我解釋一個例子。

public interface Lunch
{
   public void eat();
}

public class Buffet implements Lunch
{
   public void eat()
   {
      // Eat as much as you can 
   }
}

public class Plated implements Lunch
{
   public void eat()
   {
      // Eat a limited portion
   }
}

現在在我的代碼中,我有一個類LunchDecide如下:

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(){
        this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
        //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion 
    }
}

在上面的課上,根據我們的心情,我們選擇了Buffet()或Plated()。 但是這個系統是緊密結合的。 每次我們需要一個不同類型的對象,我們需要改變代碼。 在這種情況下,註釋掉一行! 想像一下,50個不同的人使用了50個不同的類。 這將是一個混亂的地獄。 在這種情況下,我們需要將系統解耦。 我們來重寫LunchDecide類。

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

請注意,不是使用new關鍵字創建對象,而是將對Lunch Type的對象的引用作為參數傳遞給我們的構造函數。 這裡,對象創建是外包的。 此代碼可以使用Xml配置文件(傳統)或Java註釋(現代)連線。 無論哪種方式,決定哪種類型的對象將在運行時在那裡完成。 一個對象將通過Xml注入到我們的代碼中 - 我們的代碼依賴於該作業的Xml。 因此,依賴注入(DI)。 DI不僅有助於使我們的系統鬆散耦合,還簡化了單元測試的編寫,因為它允許依賴性被嘲弄。 最後但並非最不重要的是,DI簡化了面向方面編程(Aspect Oriented Programming,AOP),從而進一步解耦和增加了模塊性。 另外請注意,上面的DI是構造器注入。 DI也可以通過Setter Injection來完成 - 同樣的普通老式封裝方法。




接受的答案不涉及註釋的使用,因為Spring引入了對配置的各種註釋的支持。

Spring(依賴注入)方法

還有另外一種方法可以使用XML文件連接類:註釋。 讓我們使用接受的答案中的示例,並使用唯一的註釋@Bean直接在類中註冊bean:

@Bean
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

這樣當視圖被創建時,神奇的將會有一個UserLister準備好工作。

上面的語句是有效的,不需要任何XML文件的使用和接線另一個註釋@Autowired ,找到一個相關的實現並註入一點獎金。

@Autowired
private UserLister userLister;



Spring開始是一個相當簡單的依賴注入系統。 現在它是巨大的,並擁有一切(除了諺語的廚房水槽)。

但不要害怕,它是相當模塊化的,所以你可以只使用你想要的部分。

要看到這一切開始嘗試:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

它可能是舊的,但它是一本很好的書。

這次專門針對春天的另一本好書看到:

http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

它也引用了Spring的老版本,但絕對值得一看。




Spring在開始時就是依賴注入,然後為幾乎所有東西(JPA實現的封裝)添加包裝王。

長篇故事... Spring preffer XML解決方案(XML腳本引擎... brrrr)的大部分部分,所以對於DI我使用Guice

良好的庫,但隨著越來越depnedenciec,例如Sprong JDBC(也許一個Java jdbc解決方案與實名參數)接下來從maven 4-5。

使用Spring MVC(“大春天”的一部分)進行Web開發...這是“基於請求的”框架,有聖戰“請求與組件”