Spring Boot → 01:概要

背景

  大約20年前,程序員們使用「企業級Java Bean」(EJB)開發企業應用,須要配置複雜的XML。
  在二十世紀初期,新興Java技術——Spring,橫空出世。使用極簡XML和POJO(普通Java對象),結合EJB的替代品(如Hibernate),Spring在企業級Java開發上佔據了絕對領先地位。
  可是,隨着Spring的不斷髮展,當初的XML配置逐漸變得複雜龐大,成了累贅,遭衆多程序員「詬病」。後來,Spring推出了JavaConfig項目,使用聲明式的註解,大量減小了顯式的XML配置。
  然而,問題到這裏,並無結束。html

1、J2EE(Java 2 Platform Enterprise Edition)簡介

  • javaee知識結構圖

  

  • J2EE 的四層模型

J2EE使用多層的分佈式應用模型,以下圖所示:java

  應用邏輯按功能劃分爲組件,各個應用組件根據他們所在的層分佈在不一樣的機器上。事實上,sun設計J2EE的初衷正是爲了解決兩層模式(client/server)的弊端,在傳統模式中,客戶端擔當了過多的角色而顯得臃腫。
  J2EE平臺由一整套服務(Services)、應用程序接口(APIs)和協議構成,它對開發基於Web的多層應用提供了功能支持。
  以下是對J2EE中的13種技術規範進行簡單的描述[3]:python

  • JDBC(Java Database Connectivity): JDBC API爲訪問不一樣的數據庫提供了一種統一的途徑,象ODBC同樣,JDBC對開發者屏蔽了一些細節問題,另外,JDCB對數據庫的訪問也具備平臺無關性。
  • JNDI(Java Name and Directory Interface): JNDI API被用於執行名字和目錄服務。它提供了一致的模型來存取和操做企業級的資源如DNS和LDAP,本地文件系統,或應用服務器中的對象。
  • EJB(Enterprise JavaBean): J2EE技術之因此贏得某體普遍重視的緣由之一就是EJB。它們提供了一個框架來開發和實施分佈式商務邏輯,由此很顯著地簡化了具備可伸縮性和高度複雜的企業級應用的開發。EJB規範定義了EJB組件在什麼時候如何與它們的容器進行交互做用。容器負責提供公用的服務,例如目錄服務、事務管理、安全性、資源緩衝池以及容錯性。但這裏值得注意的是,EJB並非實現J2EE的惟一途徑。正是因爲J2EE的開放性,使得有的廠商可以以一種和EJB平行的方式來達到一樣的目的。
  • RMI(Remote Method Invoke): 正如其名字所表示的那樣,RMI協議調用遠程對象上方法。它使用了序列化方式在客戶端和服務器端傳遞數據。RMI是一種被EJB使用的更底層的協議。
  • Java IDL/CORBA: 在Java IDL的支持下,開發人員能夠將Java和CORBA集成在一塊兒。 他們能夠建立Java對象並使之可在CORBA ORB中展開, 或者他們還能夠建立Java類並做爲和其它ORB一塊兒展開的CORBA對象的客戶。後一種方法提供了另一種途徑,經過它Java能夠被用於將你的新的應用和舊的系統相集成。
  • JSP(Java Server Pages): JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。服務器在頁面被客戶端所請求之後對這些Java代碼進行處理,而後將生成的HTML頁面返回給客戶端的瀏覽器。
  • Java Servlet: Servlet是一種小型的Java程序,它擴展了Web服務器的功能。做爲一種服務器端的應用,當被請求時開始執行,這和CGI Perl腳本很類似。Servlet提供的功能大多與JSP相似,不過實現的方式不一樣。JSP一般是大多數HTML代碼中嵌入少許的Java代碼,而servlets所有由Java寫成而且生成HTML。
  • XML(Extensible Markup Language): XML是一種能夠用來定義其它標記語言的語言。它被用來在不一樣的商務過程當中共享數據。XML的發展和Java是相互獨立的,可是,它和Java具備的相同目標正是平臺獨立性。經過將Java和XML的組合,您能夠獲得一個完美的具備平臺獨立性的解決方案。
  • JMS(Java Message Service): MS是用於和麪向消息的中間件相互通訊的應用程序接口(API)。它既支持點對點的域,有支持發佈/訂閱(publish/subscribe)類型的域,而且提供對下列類型的支持:經承認的消息傳遞,事務型消息的傳遞,一致性消息和具備持久性的訂閱者支持。JMS還提供了另外一種方式來對您的應用與舊的後臺系統相集成。
  • JTA(Java Transaction Architecture): JTA定義了一種標準的API,應用系統由此能夠訪問各類事務監控。
  • JTS(Java Transaction Service): JTS是CORBA OTS事務監控的基本的實現。JTS規定了事務管理器的實現方式。該事務管理器是在高層支持Java
  • Transaction API (JTA)規範,而且在較底層實現OMG OTS specification的Java映像。JTS事務管理器爲應用服務器、資源管理器、獨立的應用以及通訊資源管理器提供了事務服務。
  • JavaMail: JavaMail是用於存取郵件服務器的API,它提供了一套郵件服務器的抽象類。不只支持SMTP服務器,也支持IMAP服務器。
  • JTA(JavaBeans Activation Framework): JavaMail利用JAF來處理MIME編碼的郵件附件。MIME的字節流能夠被轉換成Java對象,或者轉換自Java對象。大多數應用均可以不須要直接使用JAF。

  J2EE提供了"編寫一次、隨處運行"的特性、方便存取數據庫的JDBC API、CORBA技術以及可以在Internet應用中保護數據的安全模式等等,同時還提供了對 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML(標準通用標記語言的子集)技術的全面支持。git

2、Java企業級開發框架概述

  • EJB(Enterprise Java Bean)

  曾幾什麼時候,EJB被人們當作J2EE的核心而頂禮膜拜。
  EJB就是把原來放到客戶端實現的代碼放到服務器端,並依靠RMI(Remote Method Invocation,是EJB的 技術基礎)進行通訊。而客戶端就單純負責發送調用請求和顯示處理結果。
  在J2EE 中,這個運行在一個獨立的服務器上,並封裝了業務邏輯的組件就EJB組件。
  回顧EJB出現之前的Java應用開發,大部分開發者直接用JSP頁面,再加上少許Java Bean就能夠完成整個應用,全部的業務邏輯、數據庫訪問邏輯都直接寫在JSP頁面中。系統開發前期,開發者不會意識到有什麼問題,但隨着開發進行到後期,應用愈來愈大,開發者須要花費大量時間去解決很是常見的系統級問題,反而無暇顧及真正須要解決的業務邏輯問題。
  對於EJB來講,它提供了一種良好的組件封裝,EJB容器負責處理如事務、訪問控制等系統級問題,而EJB開發者則集中精力去實現業務邏輯;對頁面開發者而言,EJB的存在無須關心,EJB的實現無須關心,他們只要調用EJB的方法便可。
  基於EJB的程序架構整體有一個很是優秀的思想:業務邏輯相關的實現集中在EJB中完成,而EJB容器則負責提供帶有重複性質的、系統級的功能,這樣EJB組件就可對外提供完整的業務服務。
  可是,因爲EJB開發的複雜性,致使許多開發者的批評,以至後來直接催生了spring框架。Spring容器管理的再也不是複雜的EJB組件,而是POJO(Plain Old Java Object) Bean。Spring容器取代了原有的EJB容器,以Spring框架爲核心的應用無須EJB容器支持,能夠直接在Web容器中運行。
  如今SSH(Spring + Struts + Hibernate)是愈來愈少了,如今比較通用的是SSM(Spring + SpringMVC + Mybatis)。
  在SSH框架中,Spring負責容器管理,對象生命週期的管理以及對象關係的維護。Hibernate負責持久層,它將JDBC作了一個良好的封裝,程序員在與數據庫進行交互時能夠不用書寫大量的SQL語句。Struts是在應用層,它負責調用serivce業務邏輯層。
  • Struts

  爲了解決這些問題,出現了Struts框架,它是一個完美的MVC實現,它有一箇中央控制類(一個Servlet),針對不一樣的業務,咱們須要一個Action類負責頁面跳轉和後臺邏輯運算,一個或幾個JSP頁面負責數據的輸入和輸出顯示,還有一個Form類負責傳遞Action和JSP中間的數據。JSP中可使用Struts框架提供的一組標籤,就像使用HTML標籤同樣簡單,可是能夠完成很是複雜的邏輯。今後JSP頁面中不須要出現一行<%%>包圍的Java代碼了。
但是全部的運算邏輯都放在Struts的Action裏將使得Action類複用度低和邏輯混亂,因此一般人們會把整個Web應用程序分爲三層,Struts負責顯示層,它調用業務層完成運算邏輯,業務層再調用持久層完成數據庫的讀寫。
  使用JDBC鏈接來讀寫數據庫,咱們最多見的就是打開數據庫鏈接、使用複雜的SQL語句進行讀寫、關閉鏈接,得到的數據又須要轉換或封裝後往外傳,這是一個很是煩瑣的過程。程序員

  • Hibernate

  這時出現了Hibernate框架。它對JDBC提供了封裝。Hibernate的O/R Mapping實現了POJO 和數據庫表之間的映射,以及SQL的自動生成和執行。
  Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,它將POJO與數據庫表創建映射關係,是一個全自動的orm框架,hibernate能夠自動生成SQL語句,自動執行,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序使用,也能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。[8]
  如今咱們有三個層了,但是每層之間的調用是怎樣的呢?好比顯示層的Struts須要調用一個業務類,就須要new一個業務類出來,而後使用;業務層須要調用持久層的類,也須要new一個持久層類出來用。經過這種new的方式互相調用就是軟件開發中最糟糕設計的體現。簡單的說,就是調用者依賴被調用者,它們之間造成了強耦合,若是我想在其餘地方複用某個類,則這個類依賴的其餘類也須要包含。程序就變得很混亂,每一個類互相依賴互相調用,複用度極低。若是一個類作了修改,則依賴它的不少類都會受到牽連。 爲此,出現了Spring框架。github

  • Mybatis

  MyBatis是另一個普遍使用的ORM框架。本來是Apache的一個開源項目iBatis, 後更名爲MyBatis 。MyBatis的核心在於管理 POJO 與 SQL 之間的映射關係。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
  Mybatis框架的架構以下圖:web

Mybatis框架的架構
MyBatis相對於Hibernate,主要優點是能夠進行更爲細緻的SQL優化。
關於MyBatis,詳細瞭解可參考:http://www.mybatis.org/mybatis-3/zh/index.htmlredis

  • Spring框架
Spring Framework:
Core support for dependency injection, transaction management, web applications, data access, messaging, testing and more.

  Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson建立。簡單來講,Spring是一個分層的JavaSE/EE full-stack(全棧式) 輕量級開源框架。spring

  • 循證架構(Evidence-Based Architecture)

  Rod Johnson在2002年編著的《Expert one on one J2EE design and development》一書中,對Java EE 系統框架臃腫、低效、脫離現實的種種現狀提出了質疑,並積極尋求探索革新之道。以此書爲指導思想,他編寫了interface21框架,這是一個力圖衝破J2EE傳統開發的困境,從實際需求出發,着眼於輕便、靈巧,易於開發、測試和部署的輕量級開發框架。
  Spring框架即以interface21框架爲基礎,通過從新設計,並不斷豐富其內涵,於2004年3月24日,發佈了1.0正式版。同年他又推出了一部堪稱經典的力做《Expert one-on-one J2EE Development without EJB》,該書在Java世界掀起了軒然大波,不斷改變着Java開發者程序設計和開發的思考方式。
  沒有最好的架構,只有最合適的架構。循證架構是《Expert One-on-One J2EE Development without EJB》(Rod Johnson,)一書中推崇的架構思路,用俺們的話說就是摸着石頭過河,找最適合本身的架構。
  咱們曾經在無數的書籍和文章中看到,EJB是J2EE的核心技術之一。而Rod Johnson居然宣稱,絕大多數的J2EE應用根本不須要EJB。
  Rod Johnson引領了一場J2EE領域影響深遠的變革。Spring和Hibernate,IoC和AOP,輕量級架構等等。還有更重要的一點,是遵循一切實事求是的「循證架構」的問題解決的方法論哲學。sql

Rod Johnson認爲,應該是基於實踐的證據、來自歷史項目或親自試驗的經驗,而不是任何形式的偶像崇拜或者門戶之見。[10]

  「循證哲學」(基於實踐的證據、來自歷史項目或親自試驗的經驗)、「實事求是」的工做方式——這本來就應該是程序員的工做方式。

「認識來源於實踐,而又運用於實踐」。
——馬克思

  人的認識來源於實踐,是隨着實踐的發展而發展的。經過實踐得出的認識,只有做用於實踐並經過實踐的檢驗,纔可以肯定認識的正確與否。
  循證架構思想來源於」循證明踐「。任何涉及模式,架構模式,編程範式(過程式,面向對象式,函數式,邏輯式,面向服務式)的問題,都是基於解決某個實際業務場景纔有其實質存在的意義。

循證明踐(Evidence-Based Practise),亦爲循證學。本意是"基於證據的實踐",其理念始於20世紀末發展起來的循證醫學。最初意指醫生"將當前所能得到的最佳研究證據與自身的專業技能及患者的價值觀整合起來進行治療"。此後,它便以迅雷不及掩耳之勢席捲了整個醫療衛生領域,並不斷向鄰近學科滲透,造成了循證心理治療、循證教育學、循證社會學等數十個新的學科領域。

  在程序開發裏不一樣模塊之間信息的溝通是經過對象傳遞完成的,而對象可否順利傳遞就是要合理的構建好對象,而管理好對象的構建方式就能管理好對象傳遞,spring主要就是解決這個問題的。spring提供一個容器,咱們在xml文件裏,或者經過註解的方式(註解的方式是經過反射機制實現)定義各個對象的依賴關係,由容器完成對象的生命週期的管理(建立,運行,銷燬)。
Spring框架創建在IOC和AOP技術之上。

  IOC: Inversion of Control,控制反轉,就是由容器控制程序之間的(依賴)關係,而非傳統實現中,由程序代碼直接操控。 當咱們的代碼裏須要使用某個實例的時候就能夠直接從容器裏獲取。對象的實例化由spring容器負責搞定,因此它被稱爲控制反轉,控制反轉的意思就是原本屬於java程序裏構建對象的功能交由容器接管,依賴注入(DI)就是當程序要使用某個對象時候,容器會把它注入到程序裏。Spring IOC有三種注入方式:接口注入、setter注入、構造器注入。
  AOP: Aspect Oriented Programming,面向切面編程,就是把可重用的功能提取出來,而後將這些通用功能在合適的時候織入到應用程序中,好比事務管理、權限控制、日誌記錄、性能統計等。經過預編譯方式和運行期動態代理實現業務邏輯模塊之間的隔離,使業務邏輯模塊間的耦合度極大化地下降,提升程序可重用性和開發的效率。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。AOP的工做模式以下圖所示:

 

 

3、Spring生態系統

  • Spring的總體架構

  Spring框架至今已集成了20多個模塊。這些模塊主要被分以下圖所示的核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊[5]:

Spring總體架構

 

  • Core Container

  核心部分分爲4大塊,spring-core, spring-beans, spring-context, spring-expression. 其中core和bean是整個框架的核心,提供了基礎的DI和IoC功能。 Context創建在core和beans模塊之上,提供一種相似JNDI且以框架的方式來操做對象的方式。Context模塊從beans模塊繼承它的功能同時增長了國際化支持,如資源綁定等,同時,Context模塊也支持JavaEE功能,如EJB,JMX和基本的遠程調用。ApplicationContext接口是context模塊的焦點。expression是一種很強大的expression language,支持在運行時查詢和操做對象的屬性,咱們會在後面的文章中舉些例子來講明spring expression language的用法。

  • AOP and instrumentation

  Aop模塊提供了面向切面編程的實現,和AspectJ集成。

  • Messaging

  Messaging是spring4新增長的模塊,包含了一部分主要的基於message的應用的實現。

  • Data Access/Integration

  Data access顧名思義,是spring對數據層提供的支持,是功能比較豐富的模塊。提供了包括JDBC,事物,ORM,JMS等一系列實現。

  • Web

  Web模塊主要提供面向web的一些實現,例如多文件上傳,servlet監聽器以及spring mvc方面的支持。

  • Test

  Test模塊主要是針對spring的各個模塊作各類各樣的測試,包括單元測試、集成測試等等。

4、Spring JavaConfig

  • Java元編程 (meta-programming)

  通常代碼的操做對象是數據。元編程操做的對象是代碼。
  元編程一言以蔽之,就是用代碼生成(操縱)代碼。在運行時建立和修改代碼而非編程時,這種程序叫作元程序。而編寫這種程序就叫作元編程。元編程是用代碼在編譯期或運行期生成/改變代碼。元編程是現實世界的抽象的利器。
  元編程技術在多種編程語言中均可以使用,但更多的仍是被應用於動態語言中,由於動態語言提供了更多的在運行時將代碼視爲數據進行操縱的能力。
  Java 5中提供了Annotations,它是Java的metadata。Java應用中的元數據在早期Java版本中,通常使用屬性文件、XML,後來註解出現了,就都用註解了。
  Java經過反射機制實現元編程。反射是促進元編程的一種頗有價值的語言特性。
  常見的開發語言均能作到元編程,Lisp就不用多說了,C的Marco,C++的Template,Java的Annotation,C#的Attribute、Reflection、CodeDom和IL Emitter,各類腳本語言(如js、python)的eval,甚至連Unix/Linux的shell腳本也能。
  元編程常見的應用場景不少,擴展語法、開發DSL、生成代碼、根據特定場景自動選擇代碼優化、解決一些正交的架構設計問題、AOP等等。
  元編程,是對語言自身再向上一層抽象。

  • JavaConfig簡介

  Spring IOC有一個很是核心的概念——Bean。由Spring容器來負責對Bean的實例化,裝配和管理。XML是用來描述Bean最爲流行的配置方式。Spring能夠從XML配置文件中讀取任何類型的元數據並自動轉換成相應的Java代碼。Spring改變了java的編程模式。
  隨着Spring的日益發展,愈來愈多的人對Spring提出了批評。「Spring項目大量的爛用XML」就是最爲嚴勵的一個批評。因爲Spring會把幾乎全部的業務類都以Bean的形式配置在XML文件中,形成了大量的XML文件。使用XML來配置Bean失去了編譯時的類型安全檢查。大量的XML配置使得整個項目變得更加複雜。Rod Johnson也注意到了這個很是嚴重的問題。
  當隨着Java EE 5.0的發佈,其中引入了一個很是重要的特性——Annotations(註解)。註解是源代碼的標籤,這些標籤能夠在源代碼層進行處理或經過編譯器把它熔入到class文件中。在Java EE 5之後的版本中,註釋成爲了一個主要的配置選項。Spring使用註釋來描述Bean的配置與採用XML相比,因類註釋是在一個類源代碼中,能夠得到類型安全檢查的好處。能夠良好的支持重構。
  JavaConfig就是使用註釋來描述Bean配置的組件。JavaConfig 是Spring的一個子項目(詳細瞭解可參考:http://docs.spring.io/spring-javaconfig/docs/).

  • JavaConfig與註解驅動配置( Annotation-Driven Configuration)
後來,當@Annotation出現了,大部分技術、框架就紛紛放棄了XML配置文件,改成使用Annotation來管理配置信息。

Spring有2種經常使用的配置方式:

  • 基於XML文件的配置
  • 基於@Annotation的配置

  Spring的XML配置方式是使用被Spring命名空間的所支持的一系列的XML標籤來實現的。Spring有如下主要的命名空間:context、beans、jdbc、tx、aop、mvc等。
  使用XML來配置Bean所能實現的功能,經過JavaConfig一樣能夠很好的實現。以前咱們都是在xml文件中定義bean的,好比:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="helloBean" class="com.hello.impl.HelloWorldImpl">
</beans>

  其實咱們可使用註解來完成這些事情,例以下面的代碼,完成的功能和上面的xml配置的功能是同樣的:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.hello.HelloWorld; import com.hello.impl.HelloWorldImpl; @Configuration public class AppConfig { @Bean(name="helloBean") public HelloWorld helloWorld() { return new HelloWorldImpl(); } }

  使用@Bean註解,來標識此方法構造出一個由Spring容器管理的bean。Spring對Java配置的支持是由@Configuration註解和@Bean註解來實現的。由@Bean註解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IoC容器來管理。@Bean聲明所起到的做用與<bean/> 元素相似。被@Configuration所註解的類則表示這個類的主要目的是做爲bean定義的資源。被@Configuration聲明的類能夠經過在同一個類的內部調用@bean方法來設置嵌入bean的依賴關係。
  通常在一個大型工程項目中,若是將全部的bean都配置在一個xml文件中,那麼這個文件就會很是的大。因此通常會將一個大的xml配置文件分割爲好幾份。這樣方便管理,最後在總的那個xml文件中導入。好比:

1 <beans xmlns="http://www.springframework.org/schema/beans"
2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3     xsi:schemaLocation="http://www.springframework.org/schema/beans
4     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
5   
6         <import resource="config/customer.xml"/>
7         <import resource="config/scheduler.xml"/>
8   
9 </beans>

  可是如今咱們也可使用JavaConfig來完成一樣的工做了:

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; @Configuration @Import({ CustomerConfig.class, SchedulerConfig.class }) public class AppConfig { }

  @Configuration能夠被認爲是至關於XML的< bean / >元素。
  Spring在2.5版本之後開始支持用註解的方式來配置依賴注入。能夠用註解的方式來替代XML方式的bean描述,能夠將bean描述轉移到組件類的內部,只須要在相關類上、方法上或者字段聲明上使用註解便可。使用JavaConfig的配置方式,一行XML代碼都不須要,什麼web.xml,Application-context.xml,Beans.xml,通通再見。
  在 Spring XML中, 啓動註解注入bean,經過以下標籤實現:

<context:annotation-config/>

  在 JavaConfig中, 等同於 @AnnotationDrivenConfig註解。
  代碼示例:

@Configuration
@AnnotationDrivenConfig
public class Config { // may now use @Autowired to reference beans from other @Configuration classes, XML, etc }

使用@ComponentScan註解,等同於在 Spring XML中的

 <context:component-scan/>

代碼示例:

package com.company.foo;

@Service
public class FooServiceImpl implements FooService { private final FooRepository fooRepository; @Autowired public FooService(FooRepository fooRepository) { this.fooRepository = fooRepository; } // ... } package com.company.foo; @Repository public class JdbcFooRepository implements FooRepository { private final DataSource dataSource; @Autowired public FooRepository(DataSource dataSource) { this.dataSource = dataSource; } // ... } @Configuration @ComponentScan("com.company") // search the com.company package for @Component classes @ImportXml("classpath:com/company/data-access-config.xml") // XML with DataSource bean public class Config { }

  在配置類中使用上述的配置,咱們就能夠在代碼裏調用service方法了:

public class Main {
    public static void main(String[] args) { JavaConfigApplicationContext ctx = new JavaConfigApplicationContext(Config.class); FooService fooService = ctx.getBean(FooService.class); fooService.doStuff(); } }

小結

  Spring框架項目的出發點是爲了解決被其餘框架所忽略的部分。在J2EE各個具體領域,都有不少出色的解決方案,web框架持久化方案,遠程調用工具等等,然而將這些工具整合成一個全面的架構,卻困難重重,甚至成爲一種負擔。spring提供了一個完整的解決方案,將各類專用框架整合成一個連貫的總體的架構。
  Spring誕生之初,就是爲了解決當初EJB的重量級複雜編程問題。Spring經過輕量級的架構,使用IOC(DI)和AOP,用POJO實現了EJB的功能。但是,Spring使人頭疼的繁雜的配置,讓開發者陷入了另外一個深淵(世間萬物,每每如此)。一開始,Spring使用大量xml配置。Spring 2.5引入了基於註解的組件掃描,消除了大量針對應用自身的組件的xml配置。Spring 3.0 有了Java Config解決方案,能夠替代xml。可是,仍是有使用不少Spring的特性,諸如事務管理,SpringMVC,以及集成第三方框架的時候(好比模板引擎:velocity, freemarker, thymeleaf),仍是須要大量的顯式配置。配置Servlet和Filter等一樣須要在web.xml裏面配置。
  對了,還有運行調試的時候,須要配置web容器等大量手工勞動。
  這些配置,耗去了程序員們的大量的精力和時間,使得生產效率大減折扣。程序員們的大腦不得不在編寫業務邏輯代碼跟xml配置之間來回切換。
  在後面的章節中,咱們將看到Spring Boot對程序員更加簡易地使用Spring框架上面所帶來的巨大變化,以及對Spring生態體系,各類技術框架的的整合集成。

 

 Spring Boot,簡單講就是犧牲項目的自由度來減小配置的複雜度(「契約式編程」思想,SpringBoot自動配置方案的指導思想)。約定一套規則,把這些框架都自動配置集成好,從而達到「開箱即用」。同時,也支持自由配置。這就是一個很是好的方案了。
  Java Web開發涉及的技術比較繁雜,涉及到不少開發框架和工具(Java, Scala, Kotlin, Clojure,Groovy, Grails,Gradle, Maven, JDBC,Mysql, oracle, mongodb, Tomcat,Jetty,Spring,Struts,Hibernate,Mybatis,JPA,JSP,velocity,freemarker,thymeleaf ,Redis,... ),並且它們各有所長,並非一個完善的體系。這對程序員能進行Jave Web開發,帶來了必定的技術門檻和學習成本。
  有沒有一個像「航空母艦(Aircraft Carrier)」式的威力強大的武器,能夠整合這一切呢?答案就是:Spring Boot。

1、用Spring Boot創造一切

  SpringBoot讓建立獨立的,生產環境的基於Spring的應用更加快捷簡易。 大部分Spring Boot Application只要一些極簡的配置,便可「一鍵運行」。
  SpringBoot的特性以下[1]:

  1. 建立獨立的Spring applications
  2. 可以使用內嵌的Tomcat, Jetty or Undertow,不須要部署war
  3. 提供定製化的starter poms來簡化maven配置(gradle相同)
  4. 追求極致的自動配置Spring
  5. 提供一些生產環境的特性,好比特徵指標,健康檢查和外部配置。
  6. 零代碼生成和零XML配置

  Spring因爲其繁瑣的配置,一度被人認爲「配置地獄」,各類XML、Annotation配置,讓人眼花繚亂,並且若是出錯了也很難找出緣由。而Spring Boot更多的是採用Java Config的方式,對Spring進行配置。
  咱們企業級軟件的目標是提供穩定健壯的服務,以實現其商業價值。爲了知足這些需求,服務開發者須要可以快速構建和迭代新的應用,同時應用的架構是可擴展的,便攜式的,富彈性的,能夠進行頻繁的更新。SpringBoot正式爲此而誕生[2]。

2、Spring Boot起源

  SpringBoot是伴隨着Spring4.0誕生的;
  從字面理解,Boot是引導的意思,所以SpringBoot幫助開發者快速搭建Spring框架;SpringBoot幫助開發者快速啓動一個Web容器;SpringBoot繼承了原有Spring框架的優秀基因;SpringBoot使得基於Spring的開發過程更加簡易。

Change is inevitable, that's the only constant. Become the Future You Imagine (Rob Mee, Pivotal CEO)[3]

  Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置。經過這種方式,Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成爲領導者。

  多年以來,Spring IO平臺飽受非議的一點就是大量的XML配置以及複雜的依賴管理。在去年的SpringOne 2GX會議上,Pivotal的CTO Adrian Colyer迴應了這些批評,而且特別提到該平臺未來的目標之一就是實現免XML配置的開發體驗。Boot所實現的功能超出了這個任務的描述,開發人員不只再也不須要編寫XML,並且在一些場景中甚至不須要編寫繁瑣的import語句。
  然而,Spring Boot並非要成爲Spring IO平臺裏面衆多「Foundation」層項目的替代者。Spring Boot的目標不在於爲已解決的問題域提供新的解決方案,而是爲平臺帶來另外一種開發體驗,從而簡化對這些已有技術的使用。對於已經熟悉Spring生態系統的開發人員來講,Boot是一個很理想的選擇,不過對於採用Spring技術的新人來講,Boot提供一種更簡潔的方式來使用這些技術。

3、Spring Boot在Spring生態中的構成

  一、Spring生態頂級項目

    做爲當前主流的企業框架Spring,它提供了一整套相關的頂級項目,能讓開發者快速的上手實現本身的應用。請看下圖「Spring航空母艦」:

  • Spring IO platform:用於系統部署,是可集成的,構建現代化應用的版本平臺,具體來講當你使用maven dependency引入spring jar包時它就在工做了。
  • Spring Boot:旨在簡化建立產品級的 Spring 應用和服務,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用微服務功能,能夠和spring cloud聯合部署。
  • Spring Framework:即一般所說的spring 框架,是一個開源的Java/Java EE全功能棧應用程序框架,其它spring項目如spring boot也依賴於此框架。
  • Spring Cloud:微服務工具包,爲開發者提供了在分佈式系統的配置管理、服務發現、斷路器、智能路由、微代理、控制總線等開發工具包。
  • Spring XD:是一種運行時環境(服務器軟件,非開發框架),組合spring技術,如spring batch、spring boot、spring data,採集大數據並處理。
  • Spring Data:是一個數據訪問及操做的工具包,封裝了不少種數據及數據庫的訪問相關技術,包括:jdbc、Redis、MongoDB、Neo4j等。
  • Spring Batch:批處理框架,或說是批量任務執行管理器,功能包括任務調度、日誌記錄/跟蹤等。
  • Spring Security:是一個可以爲基於Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。
  • Spring Integration:面向企業應用集成(EAI/ESB)的編程框架,支持的通訊方式包括HTTP、FTP、TCP/UDP、JMS、RabbitMQ、Email等。
  • Spring Social:一組工具包,一組鏈接社交服務API,如Twitter、Facebook、LinkedIn、GitHub等,有幾十個。
  • Spring AMQP:消息隊列操做的工具包,主要是封裝了RabbitMQ的操做。
  • Spring HATEOAS:是一個用於支持實現超文本驅動的 REST Web 服務的開發庫。
  • Spring Mobile:是Spring MVC的擴展,用來簡化手機上的Web應用開發。
  • Spring for Android:是Spring框架的一個擴展,其主要目的在意簡化Android本地應用的開發,提供RestTemplate來訪問Rest服務。
  • Spring Web Flow:目標是成爲管理Web應用頁面流程的最佳方案,將頁面跳轉流程單獨管理,並可配置。
  • Spring LDAP:是一個用於操做LDAP的Java工具包,基於Spring的JdbcTemplate模式,簡化LDAP訪問。
  • Spring Session:session管理的開發工具包,讓你能夠把session保存到redis等,進行集羣化session管理。
  • Spring Web Services:是基於Spring的Web服務框架,提供SOAP服務開發,容許經過多種方式建立Web服務。
  • Spring Shell:提供交互式的Shell可以讓你使用簡單的基於Spring的編程模型來開發命令,好比Spring Roo命令。
  • Spring Roo:是一種Spring開發的輔助工具,使用命令行操做來生成自動化項目,操做很是相似於Rails。
  • Spring Scala:爲Scala語言編程提供的spring框架的封裝(新的編程語言,Java平臺的Scala於2003年末/2004年初發布)。
  • Spring BlazeDS Integration:一個開發RIA工具包,能夠集成Adobe Flex、BlazeDS、Spring以及Java技術建立RIA。
  • Spring Loaded:用於實現java程序和web應用的熱部署的開源工具。
  • Spring REST Shell:能夠調用Rest服務的命令行工具,敲命令行操做Rest服務。

  二、Spring cloud子項目

目前來講spring主要集中於spring boot(用於開發微服務)和spring cloud相關框架的開發。spring cloud子項目包括:

  • Spring Cloud Config:配置管理開發工具包,可讓你把配置放到遠程服務器,目前支持本地存儲、Git以及Subversion。
  • Spring Cloud Bus:事件、消息總線,用於在集羣(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。
  • Spring Cloud Netflix:針對多種Netflix組件提供的開發工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
  • Netflix Eureka:雲端負載均衡,一個基於 REST 的服務,用於定位服務,以實現雲端的負載均衡和中間層服務器的故障轉移。
  • Netflix Hystrix:容錯管理工具,旨在經過控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
  • Netflix Zuul:邊緣服務工具,是提供動態路由,監控,彈性,安全等的邊緣服務。
  • Netflix Archaius:配置管理API,包含一系列配置管理API,提供動態類型化屬性、線程安全配置操做、輪詢框架、回調機制等功能。
  • Spring Cloud for Cloud Foundry:經過Oauth2協議綁定服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平臺。
  • Spring Cloud Sleuth:日誌收集工具包,封裝了Dapper,Zipkin和HTrace操做。
  • Spring Cloud Data Flow:大數據操做工具,經過命令行方式操做數據流。
  • Spring Cloud Security:安全工具包,爲你的應用程序添加安全控制,主要是指OAuth2。
  • Spring Cloud Consul:封裝了Consul操做,consul是一個服務發現與配置工具,與Docker容器能夠無縫集成。
  • Spring Cloud Zookeeper:操做Zookeeper的工具包,用於使用zookeeper方式的服務註冊和發現。
  • Spring Cloud Stream:數據流操做開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
  • Spring Cloud CLI:基於 Spring Boot CLI,可讓你以命令行方式快速創建雲組件。

4、Spring Boot核心組件

5、Spring Boot版本歷史

6、Spring Boot學習成本

正由於Spring Boot是與Spring一脈相承的,因此對於廣大的Java開發者而言,對於Spring的學習成本幾乎爲零。
在實踐Spring Boot時學習重點,或者說思惟方式改變的重點在於:
1)對於REST的理解,這一點尤其重要,須要從設計、開發多個角色達成共識,不少時候都是對於HTTP 1.1協議以及REST的精髓不理解,致使REST被「盲用」而產生一些很差的效果。
2)對於YAML的理解和對於JavaConfig的理解,這兩點相對較爲簡單,本質上是簡化了xml文件,並提供等價的配置表述能力。

相關文章
相關標籤/搜索