Spring技術內幕:設計理念和總體架構概述(轉)

程序員都很崇拜技術大神,很大一部分是由於他們發現和解決問題的能力,特別是線上出現緊急問題時,老是可以快速定位和解決。javascript

一方面,他們有深厚的技術基礎,對應用的技術知其因此然,另外一方面,在採坑的過程當中不斷總結,積累了不少經驗。java

相信你們都使用過Spring,有些人瞭解它的核心:IOC和AOP,但只是瞭解它們的基本概念、使用了反射和動態代理,關於如何管理對象、代理的具體實現瞭解的比較淺。程序員

有些人使用Spring MVC,使用Spring集成數據庫、事務、消息隊列以簡化操做,但對集成的具體設計思路和實現瞭解的也比較淺。web

我也這一塊也比較菜,因此,後面的一段時間會梳理和總結Spring相關的技術原理,以「Spring技術內幕:深刻解析Spring架構與設計原理」書籍爲核心,結合本身的使用經驗和疑問,以及網絡上大牛的文章,來補足本身這方面的缺失。spring

這本書做者是計文柯,以Spring源代碼爲依託,從宏觀上揭示了Spring的設計思路和架構思想,從微觀上剖析了Spring各功能模塊的實現原理和運行機制。一方面但願讀者能經過深刻了解Spring的底層機制來更好地解決實際開發中遇到的各類難題,另外一方面是但願讀者能吸取Spring設計和實現中的優秀方法和思想。數據庫

全書共三部分,分別闡述了Spring的核心、組件和應用。第一部分詳細分析了IOC容器和AOP實現,第二部分闡述了基於Spring IOC容器和AOP的Java EE組件在Spring中的實現,第三部分講述了一些基於Spring的典型應用的實現。express

本篇先對設計理念和總體架構作個概述,從總體上看看Spring的設計目標和架構,經過本篇,你會了解到:編程

  • Spring的設計目標
  • Spring的總體架構
  • Spring的各個子項目介紹

設計目標

簡單來講,Spring的設計目標是爲咱們提供一個一站式的輕量級應用開發平臺,抽象了應用開發中遇到的共性問題。api

做爲平臺,它考慮到了企業應用資源的使用,好比數據的持久化、數據集成、事務處理、消息中間件、分佈式式計算等高效可靠處理企業數據方法的技術抽象。數組

輕量級是相對於傳統J2EE而言的,傳統的J2EE開發,須要依賴按照J2EE規範實現的J2EE應用服務器,設計和實現時,須要遵循一系列的接口標準,這種開發方式耦合性高,使應用在可測試性和部署上都有影響,對技術的理解和要求相對較高。

使用Spring進行開發,對開發人員比較輕量,可使用POJO和JavaBean的開發方式,使應用面向接口開發,充分支持了面向對象的設計方法。經過IOC容器減小了直接耦合,經過AOP以動態和非侵入的方式增長了服務的功能,爲靈活選取不一樣的服務實現提供了基礎,這也是Spring的核心。

開發過程當中的共性問題,Spring封裝成了各類組件,並且Spring經過社區,造成了一個開放的生態系統,好比Spring Security就是來源於一個社區貢獻Acegi.

總體架構

從整體來看,Spring分爲3層,最底層是核心層,包括IOC、AOP等核心模塊,中間層是封裝的JavaEE服務、做爲中間的驅動組件,最上層是各個應用。

下圖是Spring官網的一個架構圖,介紹下其組成部分:

 

Spring Framework架構圖

 

核心容器

由spring-core、spring-beans、spring-context、spring-context-support和spring-expression模塊組成:

spring-core和spring-beans提供框架的基礎部分,包括IOC功能,BeanFactory是一個複雜的工廠模式的實現,將配置和特定的依賴從實際程序邏輯中解耦。

context模塊創建在core和beans模塊的基礎上,增長了對國際化的支持、事件廣播、資源加載和建立上下文,ApplicationContext是context模塊的重點。

spring-context-support提供對常見第三個庫的支持,集成到spring上下文中,好比緩存(ehcache,guava)、通訊(javamail)、調度(commonj,quartz)、模板引擎等(freemarker,velocity)。

spring-expression模塊提供了一個強大的表達式語言用來在運行時查詢和操做對象圖,這種語言支持對屬性值、屬性參數、方法調用、數組內容存儲、集合和索引、邏輯和算數操做及命名變量,而且經過名稱從spring的控制反轉容器中取回對象。

AOP和服務器工具

spring-aop模塊提供面向切面編程實現,單獨的spring-aspects模塊提供了aspectj的集成和適用。

spring-instrument提供一些類級的工具支持和ClassLoader級的實現,用於服務器。spring-instrument-tomcat針對tomcat的instrument實現。

消息組件

spring框架4包含了spring-messaging模塊,從spring集成項目中抽象出來,好比Messge、MessageChannel、MessageHandler及其餘用來提供基於消息的基礎服務。

數據訪問/集成

數據訪問和集成層由JDBC、ORM、OXM、JMS和事務模塊組成。

spring-jdbc模塊提供了不須要編寫冗長的JDBC代碼和解析數據庫廠商特有的錯誤代碼的JDBC抽象出。

spring-tx模塊提供可編程和聲明式事務管理。

spring-orm模塊提供了領先的對象關係映射API集成層,如JPA、Hibernate等。

spring-oxm模塊提供抽象層用於支持Object/XML maping的實現,如JAXB、XStream等。

spring-jms模塊包含生產和消費消息的功能,從Spring4.1開始提供集成spring-messaging模塊。

Web

Web層包含spring-web、spirng-webmvc、spring-websocket和spring-webmvc-portlet模塊組成。

spring-web模塊提供了基本的面向web開發的集成功能,例如多文件上傳、使用servert listeners和web開發應用程序上下文初始化IOC容器。也包含HTTP客戶端以及spring遠程訪問的支持的web相關部分。

spring-webmvc包含spring的model-view-controller和REST web services 實現的Web應用程序。

spring-webmvc-portlet模塊提供了MVC模式的portlet實現,protlet與Servlet的最大區別是請求的處理分爲action和render階段,在一個請求中,action階段只執行一次,但render階段可能因爲用戶的瀏覽器操做而被執行屢次。

測試

spring-test模塊支持經過組合Junit或TestNG來進行單元測試和集成測試,提供了連續的加載ApplicationContext而且緩存這些上下文。

各個子項目介紹

從配置到安全,從web應用到大數據——不管您的應用程序須要什麼樣的基礎設施,都有一個Spring項目來幫助您構建它,Spring是模塊化的設計。

Spring Boot

簡化新Spring應用的初始搭建以及開發過程,使用特定的方式進行配置,使開發人員再也不須要定義樣板化的配置,實現快速開發。

Spring Cloud

爲分佈式系統開發提供工具集,基於Spring Boot,爲基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智能路由、控制總線、全局鎖、決策競選、分佈式會話、集羣狀態管理等操做提供了一種簡單的開發方式,其下有不少子項目:

  • 分佈式/版本化配置:Spring Cloud Config
  • 服務註冊和發現:Netflix Eureka 或者 Spring Cloud Eureka(對前者的二次封裝)
  • 路由:Spring Cloud Zuul,基於 Netflix Zuul
  • service - to - service調用:Spring Cloud Feign
  • 負載均衡:Spring Cloud Ribbon 基於 Netflix Ribbon 實現
  • 斷路器:Spring Cloud Hystrix
  • 分佈式消息傳遞:Spring Cloud Bus

Spring Cloud Data Flow

Data flow 是一個用於開發和執行大範圍數據處理、批量運算、持續運算的統一編程模型和託管服務。

Spring Cloud Data Flow 是基於原生雲對Spring XD的從新設計,項目目標是簡化大數據應用的開發。Spring XD的流處理和批處理模塊的重構分別基於spring boot的stream和task/batch的微服務程序。這些程序原生的支持像 Apache YARN、Apache Mesos和Kubernetes等現代運行環境,都是自動部署單元。

Spring Data

數據訪問模塊,提供了對JDBC及ORM很好的支持,隨着NOSQL和BigData的興起,出現了愈來愈多的新技術,好比非關係型數據庫、MapReduce框架,爲了讓spring開發者能更方便地使用這些新技術,經過Spring Data,開發者能夠用Spring提供的相對一致的方式訪問位於不一樣類型的數據存儲中的數據。

 

Spring Data

 

Spring Integration

在企業軟件開發過程當中,常常會遇到與外部系統集成,Spring Integration爲Spring編程模型提供了一個支持企業集成模式的擴展,在應用程序中提供輕量級的消息機制,經過聲明式的適配器與外部系統進行集成。

Spring Integraton中有幾個基本的概念:

  • Message:帶有元數據的Java對象;
  • Channel:傳遞消息的管道;
  • Message Endpoint:消息的處理端,在處理端能夠對消息進行轉換、路由、過濾、拆分、聚合等操做;

還可使用Channel Adapter,這是應用程序與外界交互的地方,輸入是Inbound、輸出則是Outbound,可選的鏈接類型有不少,好比AMQP、JDBC、Web Services、FTP、JMS、XMPP、多種NoSQL數據庫等等。只需經過簡單的配置文件就能將全部這些東西串聯在一塊兒,實現複雜的集成工做。

Spring Batch

簡化及優化大量數據的批處理操做,支持事務、併發、流程、監控、縱向和橫向擴展,提供統一的接口管理和任務管理。

例如它提供了不少方法來讀取大型的文件(好比1GB的CSV、XML文件),在數據庫中加載或更新幾萬甚至幾十萬條記錄,若是直接select出全部記錄,以致於拖垮整個系統,而使用了Spring Batch,框架會幫助他每次撈取一部分記錄進行分頁,在更新時分批進行提交。

Spring Security

一款Spring的認證和安全工具。其前身是Acegi,目標是爲Spring應用提供一個安全服務,好比用戶認證、受權等。

它使用Servlet規範中的Filter保護Web請求並限制URL級別的訪問,還可以使用Spring AOP保護方法調用——藉助於對象代理和使用通知,可以確保只有具有適當權限的用戶才能訪問安全保護的方法。

它很是靈活,可以基於各類數據存儲來認證用戶。它內置了多種常見的用戶存儲場景,如內存、關係型數據庫以及LDAP,還能夠編寫並插入自定義的用戶存儲實現。

Spring HATEOAS

先來理解HATEOAS:你們都聽過過REST,它的定位爲「分佈式超媒體應用」的架構風格,文中提到了HATEOAS(Hypermedia as the engine of application state)的概念,超媒體即應用狀態引擎,即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。

好比獲取一篇文章,非HATEOAS的響應例子是:

GET /posts/1 HTTP/1.1
Connection: keep-alive
Host: blog.example.com
{
    "id" : 1,
    "body" : "My first blog post",
    "postdate" : "2015-05-30T21:41:12.650Z"
}

而HATEOAS的響應例子是:

{
    "id" : 1, "body" : "My first blog post", "postdate" : "2015-05-30T21:41:12.650Z", "links" : [ { "rel" : "self", "href" : http://blog.example.com/posts/1, "method" : "GET" } ] } 

爲了簡化簽入或獲取超連接等操做,Spring HATEOAS提供了相關的支持。

Spring Rest DOCS

能夠生成準確可讀的RESTful Service文檔,Spring 官方文檔都是用Spring REST Docs生成的。

基於單元測試生成文檔片斷,不會侵入到源碼中,因此就不會使得源碼變得愈來愈臃腫,支持markdown,修改一行配置代碼便可支持生成 MarkDown 語法的文檔片斷。

默認的,在構建的時候,會首先運行單元測試,便生成了文檔片斷,而後在打包時,經過添加 asciidoctor-maven-plugin 插件便可生成最終的文檔,只要是規範的開發過程,文檔都會隨版本的每次發佈而自動更新。

Spring Social

使用 Spring Social 的最大好處在於它已經提供了對主流社交網站的支持,只須要簡單配置便可,對於一些不太經常使用的社交網站,也能夠從社區中找到相應的組件。

Spring AMQP

基於Spring框架的AMQP消息解決方案,提供模板化的發送和接收消息的抽象層,提供基於消息驅動的POJO,使在Spring應用中使用AMQP消息服務器變得更爲簡單,SpringSource旗下的Rabbit MQ就是一個開源的基於AMQP的消息服務器。

Spring Web Flow

Spring Web Flow是Spring MVC 的擴展,它支持開發基於流程的應用程序。它將流程的定義與實現流程行爲的類和視圖分離開來,具備同時處理多個HTTP請求、管理會話狀態、數據事務處理,支持AJAX來構建豐富的客戶端體驗,而且提供對JSF的支持。

Spring LDAP

Spring LDAP是一個用於操做LDAP的Java框架。它是基於Spring的JdbcTemplate模式,可以幫助開發人員簡化操做。

Spring Session

Spring Session提供了一套建立和管理Servlet HttpSession的方案。Spring Session提供了集羣Session功能,默認採用外置的Redis來存儲Session數據,以此來解決Session共享的問題。

Spring Shell

Spring Shell提供交互式的Shell,可讓你使用簡單的基於Spring的編程模型來開發命令。

Spring Kafka

spring for kafka對原生的kafka client consumer的封裝與集成。

Spring Statemachine

它的主要功能是幫助開發者簡化狀態機的開發過程,讓狀態機結構更加層次化。

Spring IO Platform

能夠認爲是一個依賴維護平臺,該平臺將相關依賴匯聚到一塊兒,針對每一個依賴,都提供了一個版本號。

主要是解決依賴版本衝突問題,在使用Spring的時候,常常會使用到第三方庫,通常你們都是根據經驗挑選一個版本號或挑選最新的,風向較大,很容易衝突。

Spring IO Platform能很好地解決這些問題,咱們在添加第三方依賴的時候,不須要寫版本號,它可以自動幫咱們挑選一個最優的版本。

做者:情情說 連接:https://juejin.im/post/5b012b00518825673564cbbe 來源:掘金 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索