Spring是Java平臺的一個開源的全棧應用程序框架和控制反轉容器實現。 該框架的一些核心功能理論上可用於任何Java應用,但Spring還爲基於Java企業版平臺構建的 Web 應用提供了大量的拓展支持。雖然Spring沒有直接實現任何的編程模型,但它已經在 Java社區中廣爲流行,基本上徹底代替了企業級JavaBeans(EJB)模型。react
Spring框架以 Apache License 2.0 開源許可協議的形式發佈,該框架最初由 Rod Johnson 以及 Juergen Hoeller 等人開發。初版由 Rod Johnson 開發,並在2002年10月發佈在 Expert One-on-One J2EE Design and Development 一書中。2003年6月,Spring Framework 第一次發佈在 Apache 2.0 許可證下。2004年3月,發佈了里程碑的版本1.0,2004年9月以及2005年3月,又發佈了新的里程碑版本。2006年,Spring Framework 得到了 Jolt 生產力獎 和 JAX 創新獎。程序員
2006年10月發佈Spring 2.0,2007年11月 Spring 2.5,2009年12月 Spring 3.0,2011年 Spring 3.1,2013年11月 Spring 3.2.5,2013年12月發佈了4.0版本。值得注意的是,Spring 4.0 版本中增長了對 Java SE 8, Groovy 2, Java EE 7 的一些方面以及 WebSocket 的支持。spring
2017年9月 Spring Framework 正式發佈了 5.0 版本,此版本引入了 Spring WebFlux,一個高性能、響應式、異步的 Web 框架。Spring 5.0 重點增強了對函數式編程、響應式程序設計(reactive programming)的支持能力,是一個很是大的進步。數據庫
最先的1996年開始可使用Java的Applet來開發Web應用,做爲瀏覽器組件。但開發者們很快就發現這個新興的語言還能作更多的事情。同年12月,Sun公司發佈了當時還名不見經傳但後來人盡皆知的 JavaBean 1.00-A 規範。編程
複雜的應用一般須要事務、安全、分佈式等服務的支持,但JavaBean並未直接提供。因此到了 1998年 3 月,Sun公司發佈了EJB1.0規範,該規範把Java組件的設計理念延伸到了服務器端,並提供了許多必須的企業級服務,但他也再也不像早期的JavaBean 那麼簡單了。實際上,除了名字叫 EJB Bean之外,其餘的和 JavaBean關係不大了。設計模式
儘管現實中有不少系統是基於EJB構建的,但EJB歷來沒有實現它最初的設想:簡化開發。EJB 的聲明式編程模型的確簡化了不少基礎架構層面的開發,例如事務和安全;但另外一方面 EJB 在部署描述符和配套代碼實現等方面變得異常複雜。隨着時間的推移,不少開發者對 EJB 已經再也不抱有幻想,開始尋求更簡潔的方法。瀏覽器
客觀地講,EJB 的發展甚至促進了基於 POJO 的編程模型。到了 EJB 3 規範發 布時,其餘基於 POJO的開發架構已經成爲事實的標準了,而Spring框架也就是在這樣的大環境下出現的。緩存
Spring主要經過:面向Bean(BOP)、依賴注入(DI)和麪向切面(AOP)這三種方式來達成的。安全
AOP、IOC和DI之間的關係服務器
Spring 是面向 Bean 的編程(Bean Oriented Programming, BOP),Bean 在Spring 中才是真正的主角。Bean 在 Spring 中做用就像 Object 對OOP的意義同樣,Spring 中沒有 Bean 也就沒有Spring存在的意義。Spring提供了IOC容器經過配置文件或者註解的方式來管理對象之間的依賴關係。
控制反轉(其中最多見實現方式叫作依賴注入(Dependency Injection,DI),還有一種方式叫「依賴查找」(Dependency Lookup,DL),她在 C++、Java、PHP 以及.NET 中都運用。在最先的Spring中是包含有依賴注入方法和依賴查詢的,但由於依賴查詢使用頻率太低,不久就被Spring移除了,因此在Spring中控制反轉也被直接稱做依賴注入),她的基本概念是:不建立對象,可是描述建立它們的方式。在代碼中不直接與對象和服務鏈接,但在配置文件中描述哪個組件須要哪一項服務。容器 (在 Spring 框架中是 IOC 容器)負責將這些聯繫在一塊兒。
在典型的 IOC 場景中,容器建立了全部對象,並設置必要的屬性將它們鏈接在一塊兒,決定什麼時間調用方法。
Spring 設計的核心 org.springframework.beans包(架構核心是org.springframework.core包),它的設計目標是與JavaBean組件一塊兒使用。這個包一般不是由用戶直接使用,而是由服務器將其用做其餘多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,容許經過名稱建立和檢索對象。BeanFactory 也能夠管理對象之間的關係。
BeanFactory 最底層支持兩個對象模型:
單例:提供了具備特定名稱的全局共享實例對象,能夠在查詢時對其進行檢索。Singleton 是默認的也是最經常使用的對象模型。
原型:確保每次檢索都會建立單獨的實例對象。在每一個用戶都須要本身的對象時,採用原型模式。
Bean 工廠的概念是 Spring做爲IOC容器的基礎。IOC則將處理事情的責任從應用程序代碼轉移到框架。
面向切面編程,即 AOP,是一種編程思想,它容許程序員對橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。AOP的核心構造是方面(切面),它將那些影響多個類的行爲封裝到可重用的模塊中。
AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在全部方法和 Java 類中才能實現日誌功能。在AOP方式中,能夠反過來將日誌服務模塊化,並以聲明的方式將它們應用到須要日誌的組件上。固然,優點就是Java類不須要知道日誌服務的存在,也不須要考慮相關的代碼。因此,用SpringAOP編寫的應用程序代碼是鬆散耦合的。
AOP 的功能徹底集成到了 Spring 事務管理、日誌和其餘各類特性的上下文中。
AOP 編程的經常使用場景有:Authentication(權限認證)、Auto Caching(自動緩存處理)、Error Handling (統一錯誤處理)、Debugging(調試信息輸出)、Logging(日誌記錄)、Transactions(事務處理) 等。
Spring 總共大約有 20個模塊,由1300多個不一樣的文件構成。而這些組件被分別整合在覈心容器(Core Container)、AOP(Aspect Oriented Programming)和設備支持(Instrmentation)、數據訪問 及集成(Data Access/Integeration)、Web、報文發送(Messaging)、Test,6 個模塊集合中。以 下是 Spring 5 的模塊結構圖: