相信經歷過不使用框架開發web項目的70後、80後都會有如此感悟,現在的程序員開發項目過輕鬆了,基本只須要關心業務如何實現,技術實現只須要集成框架便可。早在2007年,一個基於Java語言的開源框架正式發佈,取了一個很是有活力且美好的名字,叫作Spring。它是一個開源的輕量級Java SE(Java 標準版本)/Java EE(Java企業版本)開發應用框架,其目的就是簡化企業級應用程序開發。在傳統應用程序開發中,一個完整的應用是由一組相互協做的對象組成。因此開發一個應用除了要開發業務邏輯外,更多關注的是如何使這些對象協做來完成所需功能,並且要低耦合、高聚合。業務邏輯開發是不可避免的,可是若是有個框架出來幫咱們建立對象及管理這些對象之間的依賴關係就會是開發簡便了不少。有人也會說:「抽象工廠、工廠方法模式不是也能夠幫助咱們建立對象嗎?「生成器模式」幫咱們處理對象間的依賴關係,不也能完成這些功能嗎?「但是這些須要咱們建立另外一些工廠類、生成器類咱們又要額外管理這些類,增長了咱們的負擔,若是能有種經過配置方式來建立對象,管理對象之間的依賴關係,咱們不須要經過工廠和生成器來建立及管理對象之間的依賴關係,這樣咱們是否是能夠減小許多工做,加速了開發,能節省不少時間來幹其餘的事,Spring框架就是帶着這個使命出如今咱們面前。前端
Spring框架除了幫咱們管理對象及其依賴關係,還提供了不少實用的功能,像通用日誌記錄、性能統計、安全控制、異常處理等面向切面的能力,還能幫咱們管理最頭疼的數據庫事務,自己提供了一套簡單的JDBC訪問實現,提供與第三方數據訪問框架集成(如Hibernate\JPA),與各類Java EE 技術整合(Java Mail、任務調度Quartz等等),提供一套本身的Web層框架Spring MVC,並且還能很是簡單的與第三方Web框架集成,從這裏咱們能夠認爲Spring是一個超級大的粘合平臺,俗稱萬能膠,除了本身提供功能外,還提供粘合其餘技術和框架的能力,從而使咱們能夠更自由的選擇到底使用什麼技術進行開發。並且無論是Java SE(C/S架構)應用程序仍是Java EE(B/S架構)應用程序均可以使用這個平臺進行開發。現在的Spring已經再也不是一個框架,早已經成爲一種生態。SpringBoot的便捷式開發實現了約定優於配置,SpringCloud微服務的生態,提供了很是方便的解決方案(網關、配置中心,註冊中心,服務協調與治理等等)。接下來,讓咱們來深刻探討Spring到底能給咱們帶來什麼?java
說到Bean這個概念,還得從Java的起源提及,早在1996年,Java還只是一個新興的、初出茅廬的編程語言,由於自己跨平臺、跨系統特性,幾度威脅微軟的地位。對java感興趣的同窗能夠查看SUN公司及Netscape網景公司及微軟公司MicroSoft商戰歷史。https://www.jianshu.com/p/b35601c9d7cd和推薦李彥宏的《硅谷商戰》一書。當時人們之因此關注java,僅僅是因可使用java的Applet來開發Web應用,做爲瀏覽器組件,但開發者們很快就發現這個新興語言還能作更多的事情。與以前的全部語言不一樣,Java讓模塊化構建複雜的系統成爲可能(當時的軟件行業雖然在業務上突發猛進,但當時開發用的傳統的面向過程開發思想OP,軟件的開發效率一直躊躇不前。伴隨着業務複雜性的不斷加深,開發也變得愈加困難。其實,當時也是面向對象開發OOP思想飛速發展的時期,他在80年代末被提出,成熟與90年代,現現在大多數編程語言都已是面向對象的了。)git
同年12月,Sun公司發佈了當時還命不經傳但後來人盡皆知的JavaBean 1.00-A規範。早期的JavaBean規範針對於Java,她定義了軟件組件模型。這個規範規定了一整套編碼策略,使簡單的Java對象不只能夠被重用,並且還能夠輕鬆的構建更爲複雜的應用。儘管JavaBean最初是爲重用應用組件而設計的,噹噹時他們倒是主要用做構建窗體控件,畢竟在PC時代那纔是主流。當相比於當時正如日中天的Delphi、VB和C++,她看起來仍是太簡易了,以致於沒法勝任任何」實際的「工做須要。程序員
複雜的應用一般須要事務、安全、分佈式等服務的支持,但JavaBean並未直接提供。因此到了1998年3月,Sun公司發佈了EJB1.0規範,該規範把Java組件的設計理念延伸到了服務器端,並提供了許多必須的企業級服務,但他也再也不像早期的JavaBean那麼簡單了。實際上,除了名字叫EJB Bean之外,其餘的和JavaBean關係不大了。github
儘管現實中有不少系統是基於EJB構建的,但EJB歷來沒有實現它最初的設想:簡化開發。EJB的聲明式編程模型的確簡化了不少基礎架構層面的開發,例如事務和安全;但另外一方面EJB在部署描述符和配套代碼實現等方面變得異常複雜。隨着時間的推移,不少開發者對EJB已經再也不抱有幻想,開始尋求更簡潔的方法。web
當下Java組件的開發理念從新迴歸正軌。新的編程技術AOP和DI的不斷出現,他們爲JavaBean提供了以前EJB才能擁有的強大功能。這些技術爲POJO提供了相似EJB的聲明式編程模式,而沒有引入任何EJB的複雜性。當簡單的JavaBean足以勝任時,人們便不肯編寫笨重的EJB組件了。spring
客觀地講,EJB的發展促進了基於POJO的編程模型。引入新的理念,最新的EJB規範相比以前的規範有了史無前例的簡化,但對不少開發者而言,這一切的一切來得太遲了。到了EJB3規範發佈時,其餘的基於POJO的開發架構已經成爲事實的標準了,而Spring框架也就是在這樣的大環境下出現的。數據庫
Spring是爲了解決企業級應用開發的複雜性而設計,她能夠作不少事。但歸根到底支撐Spring的僅僅是少量的基本理念,而全部的這些理念均可以追溯到一個最根本的使命:簡化開發。這是一個鄭重的承諾,其實許多框架都聲稱在某些方法作了簡化。而Spring則立志於全方面的簡化Java開發。express
對此,她主要採起了4個關鍵策略:編程
一、基於POJO的輕量級和最小侵入性編程;
二、經過依賴注入和麪向接口鬆耦合;
三、基於切面和慣性進行聲明式編程;
四、經過切面和模板減小樣板式代碼。
主要是經過:面向Bean(BOP)、依賴注入(DI)以及面向切面(AOP)這三種方式來達成的。
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.spring.framework.beans包(架構核心是org.springframework.core包),它的設計目標是與javaBean組件一塊兒使用。這個包一般不是由用戶直接使用,而是由服務器將其用做其餘多數功能的底層中介。下一個最高級抽象是BeanFactory接口,它是工廠設計模式的實現。容許經過名稱建立和檢索對象。BeanFactory也能夠管理對象之間的關係。BeanFactory也能夠管理對象之間的關係。
BeanFactory最底層支持兩個對象模型。
1.單例:提供了具備特定名稱的全局共享實例對象,能夠在查詢的時對其進行檢索。Singlenton是默認的也是最經常使用的對象模型。
2.原型:確保每次檢索都會建立單獨的實例對象。在每一個用戶都須要本身的對象時,採用原型模式。
Bean工廠的概念是Spring做爲IOC容器的基礎。IOC則將處理事情的責任從應用程序代碼轉移到框架。
面向切面編程,即AOP,是一種編程思想,它容許程序員對橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。AOP的核心構造是方面(切面),它將那些影響多個類的行爲封裝到可重用的模塊中。
AOP和IOC是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在全部方法和Java類中才能實現日誌功能。在AOP方式中,能夠反過來將日誌服務模塊化,並以聲明的方式將它們應用到須要日誌的組件上。固然,優點就是Java類不須要知道日誌服務的存在,也不須要考慮相關的代碼。因此,用Spring AOP編寫的應用程序代碼是鬆散耦合的。
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個模塊集合中。如下是Spring5的模塊結構圖:
組成Spring 框架的每一個模塊集合或者模塊均可以單獨存在,也能夠一個或者多個模塊聯合實現。每一個模塊的組成和功能以下:
由spring-beans、spring-core、spring-context和spring-expression(Spring Expression Language,SpEL) 4個模塊組成。
spring-core 和 spring-beans 模塊是 Spring 框架的核心模塊,包含了控制反轉(Inversion of Control, IOC)和依賴注入(Dependency Injection, DI)。BeanFactory 接口是 Spring 框架中的核 心接口,它是工廠模式的具體實現。BeanFactory 使用控制反轉對應用程序的配置和依賴性規範與實際 的應用程序代碼進行了分離。但 BeanFactory 容器實例化後並不會自動實例化 Bean,只有當 Bean 被 使用時 BeanFactory 容器纔會對該 Bean 進行實例化與依賴關係的裝配。 spring-context 模塊構架於核心模塊之上,他擴展了 BeanFactory,爲她添加了 Bean 生命週期控 制、框架事件體系以及資源加載透明化等功能。此外該模塊還提供了許多企業級支持,如郵件訪問、遠 程訪問、任務調度等,ApplicationContext 是該模塊的核心接口,她的超類是 BeanFactory。與 BeanFactory 不一樣,ApplicationContext 容器實例化後會自動對全部的單實例 Bean 進行實例化與依 賴關係的裝配,使之處於待用狀態。 spring-context-support 模塊是對 Spring IOC 容器的擴展支持,以及 IOC 子容器。 spring-context-indexer 模塊是 Spring 的類管理組件和 Classpath 掃描。 spring-expression 模塊是統一表達式語言(EL)的擴展模塊,能夠查詢、管理運行中的對象,同 時也方便的能夠調用對象方法、操做數組、集合等。它的語法相似於傳統 EL,但提供了額外的功能,最 出色的要數函數調用和簡單字符串的模板函數。這種語言的特性是基於 Spring 產品的需求而設計,他 能夠很是方便地同 Spring IOC 進行交互。
由spring-aop、spring-aspects和spring-instrument 3個模塊組成。
spring-aop 是 Spring 的另外一個核心模塊,是 AOP 主要的實現模塊。做爲繼 OOP 後,對程序員影 響最大的編程思想之一,AOP 極大地開拓了人們對於編程的思路。在 Spring 中,他是以 JVM 的動態 代理技術爲基礎,而後設計出了一系列的 AOP 橫切實現,好比前置通知、返回通知、異常通知等,同 時,Pointcut 接口來匹配切入點,可使用現有的切入點來設計橫切面,也能夠擴展相關方法根據需求 進行切入。 spring-aspects 模塊集成自 AspectJ 框架,主要是爲 Spring AOP 提供多種 AOP 實現方法。 spring-instrument 模塊是基於 JAVA SE 中的"java.lang.instrument"進行設計的,應該算是 AOP 的一個支援模塊,主要做用是在 JVM 啓用時,生成一個代理類,程序員經過代理類在運行時修改類的 字節,從而改變一個類的功能,實現 AOP 的功能。在分類裏,我把他分在了 AOP 模塊下,在 Spring 官 方文檔裏對這個地方也有點含糊不清,這裏是純我的觀點。
由spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm 5個模塊組成。
spring-jdbc 模塊是 Spring 提供的 JDBC 抽象框架的主要實現模塊,用於簡化 Spring JDBC 操做 。 主要是提供 JDBC 模板方式、關係數據庫對象化方式、SimpleJdbc 方式、事務管理來簡化 JDBC 編程, 主要實現類是 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplate。 spring-tx 模塊是 Spring JDBC 事務控制實現模塊。使用 Spring 框架,它對事務作了很好的封裝, 經過它的 AOP 配置,能夠靈活的配置在任何一層;可是在不少的需求和應用,直接使用 JDBC 事務控 制仍是有其優點的。其實,事務是以業務邏輯爲基礎的;一個完整的業務應該對應業務層裏的一個方法; 若是業務操做失敗,則整個事務回滾;因此,事務控制是絕對應該放在業務層的;可是,持久層的設計 則應該遵循一個很重要的原則:保證操做的原子性,即持久層裏的每一個方法都應該是不能夠分割的。所 以,在使用 Spring JDBC 事務控制時,應該注意其特殊性。 咕泡出品,必屬精品 www.gupaoedu.com 9 spring-orm 模塊是 ORM 框架支持模塊,主要集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用於資源管理、數據訪問對象(DAO)的實現和事務策略。 spring-oxm 模塊主要提供一個抽象層以支撐 OXM(OXM 是 Object-to-XML-Mapping 的縮寫, 它是一個 O/M-mapper,將 java 對象映射成 XML 數據,或者將 XML 數據映射成 java 對象),例如: JAXB, Castor, XMLBeans, JiBX 和 XStream 等。 spring-jms 模塊(Java Messaging Service)可以發送和接收信息,自 Spring Framework 4.1 以 後,他還提供了對 spring-messaging 模塊的支撐。
由spring-web、spring-webmvc、spring-websocket和spring-webflux 4個模塊組成。
spring-web 模塊爲 Spring 提供了最基礎 Web 支持,主要創建於核心容器之上,經過 Servlet 或 者 Listeners 來初始化 IOC 容器,也包含一些與 Web 相關的支持。 spring-webmvc 模塊衆所周知是一個的 Web-Servlet 模塊,實現了 Spring MVC (model-view-Controller)的 Web 應用。 spring-websocket 模塊主要是與 Web 前端的全雙工通信的協議。 spring-webflux 是一個新的非堵塞函數式 Reactive Web 框架,能夠用來創建異步的,非阻塞, 事件驅動的服務,而且擴展性很是好。
即 spring-messaging 模塊,是從 Spring4 開始新加入的一個模塊,主要職責是爲 Spring 框架集 成一些基礎的報文傳送應用。
即 spring-test 模塊,主要爲測試提供支持的,畢竟在不須要發佈(程序)到你的應用服務器或者鏈接 到其餘企業設施的狀況下可以執行一些集成測試或者其餘測試對於任何企業都是很是重要的
即 spring-framework-bom 模塊,Bill of Materials.解決 Spring 的不一樣模塊依賴版本不一樣問題。
Spring 官網對 Spring5 各模塊之間的關係也作了詳細說明:
我本人也對 Spring5 各模塊作了一次系統的總結,描述模塊之間的依賴關係,但願能對小夥伴們有所 幫助。
接下來的博文中,咱們將深刻了解 Spring 的核心模塊功能。基本學習順序爲:從 spring-core 入手, 其次是 spring-beans 和 spring-aop,隨後是 spring-context,再其次是 spring-tx 和 spring-orm, 最後是 spring-web 和其餘部分。
描述方式 | 說明 | 含義 |
Snapshot | 快照版 | 尚不不穩定、尚處於開發中的版本 |
Release | 穩定版 | 功能相對穩定,能夠對外發行,但有時間限制 |
GA | 正式版 | 表明普遍可用的穩定版(General Availability) |
M | 里程碑版 | (M 是 Milestone 的意思)具備一些全新的功能或是具備里程碑意義 的版本。 |
RC | 終測版 | Release Candidate(最終測試),即將做爲正式版發佈。 |
Spring5 源碼下載注意事項
首先你的 JDK 須要升級到 1.8 以上。Spring3.0 開始,Spring 源碼採用 github 託管,再也不提供官網下載 連接。這裏不作過多贅述,你們可自行去 github 網站下載,咱們使用的版本下載連接爲: https://github.com/spring-projects/spring-framework/archive/v5.0.2.RELEASE.zip,下載完成後, 解壓源碼包會看到如下文件目錄:
基於 Gradle 的源碼構建技巧
因爲 Spirng5 之後都是採用 Gradle 來編譯,因此構建源碼前須要先安裝 Gradle 環境。Gradle 下載地 址:https://gradle.org/releases,我使用的是 Spring5 官方推薦的版本 Gradle4.0,下載連接爲: https://gradle.org/next-steps/?version=4.0&format=bin , 下 載 完 成 後 按 以 下 步 驟 操 做 , 以 Windows 操做系統爲例:
第一步:配置環境變量
第二步:添加環境變量:Path:%GRADLE_HOME%\bin
第三步:檢測環境,輸入 gradle -v 命令,獲得如下結果:
第四步:編譯源碼,cmd 切到 spring-framework-5.0.2.RELEASE 目錄,運行 gradlew.bat
第五步:轉換爲 eclipse 項目,執行 import-into-eclipse.bat 命令,構建前,請確保網絡狀態良好,按 任意鍵繼續。
第六步:等待構建成功(若中途出現錯誤,大部分狀況是因爲網絡中斷形成的,重試以後通常都能解決 問題),構建成功後,會出現以下界面:
到這一步爲止,還在使用 Eclipse 的小夥伴已經能夠將項目導入到 Eclipse 中了。而咱們推薦使用的 IDEA 也比較智能,能夠直接兼容 Eclipse 項目。接下來看下面的步驟:
第七步:導入 IDEA。打開 IntelliJ IDEA,點擊 Import Project,彈出以下界面,選擇 spring-framework-5.0.2.RELEASE 文件夾:
第八步:等待構建完成,在網絡良好的狀況下大約須要 10 分鐘即可自動構建完成,你會看到以下界面:
第九步:在 IDEA 中,若是 Project 下的子項目文件夾變成粗體字以後,說明已經構建成功。還有一種 驗證方式是:找到 ApplicationContext 類,按 Ctrl + Shift + Alt + U,出現類圖界面說明構建成功。
Gradle 構建過程當中的坑
若是項目環境一直沒法構建,項目文件夾沒有變粗體字,類圖沒法自動生成。那麼你必定是踩到了這樣一個坑。
第一步:首先打開 View->Tool Windows -> Gradle
而後,點擊右側 Gradle 視圖中的 Refresh,會出現以下的錯誤:
第二步:看錯誤,顯然跟 Gradle 沒有任何關係,解決辦法:
1.關閉 IDEA,打開任務管理器,結束跟 java 有關的全部進程。
2.找到 JAVA_HOME -> jre -> lib 目錄,將 tools.jar 重命名 tools.jar.bak。
3.重啓 IDEA,再次點擊 refresh,等待構建完成。