溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring技術內(nèi)幕:設計理念和整體架構概述

發(fā)布時間:2020-07-20 22:54:24 來源:網(wǎng)絡 閱讀:4514 作者:情情說 欄目:開發(fā)技術

程序員都很崇拜技術大神,很大一部分是因為他們發(fā)現(xiàn)和解決問題的能力,特別是線上出現(xiàn)緊急問題時,總是能夠快速定位和解決。

一方面,他們有深厚的技術基礎,對應用的技術知其所以然,另一方面,在采坑的過程中不斷總結,積累了很多經(jīng)驗。

相信大家都使用過Spring,有些人了解它的核心:IOC和AOP,但只是了解它們的基本概念、使用了反射和動態(tài)代理,關于如何管理對象、代理的具體實現(xiàn)了解的比較淺。

有些人使用Spring MVC,使用Spring集成數(shù)據(jù)庫、事務、消息隊列以簡化操作,但對集成的具體設計思路和實現(xiàn)了解的也比較淺。

我也這一塊也比較菜,所以,后面的一段時間會梳理和總結Spring相關的技術原理,以「Spring技術內(nèi)幕:深入解析Spring架構與設計原理」書籍為核心,結合自己的使用經(jīng)驗和疑問,以及網(wǎng)絡上大牛的文章,來補足自己這方面的缺失。

這本書作者是計文柯,以Spring源代碼為依托,從宏觀上揭示了Spring的設計思路和架構思想,從微觀上剖析了Spring各功能模塊的實現(xiàn)原理和運行機制。一方面希望讀者能通過深入了解Spring的底層機制來更好地解決實際開發(fā)中遇到的各種難題,另一方面是希望讀者能吸收Spring設計和實現(xiàn)中的優(yōu)秀方法和思想。

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

本篇先對設計理念和整體架構做個概述,從整體上看看Spring的設計目標和架構,通過本篇,你會了解到:

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

簡單來說,Spring的設計目標是為我們提供一個一站式的輕量級應用開發(fā)平臺,抽象了應用開發(fā)中遇到的共性問題。

作為平臺,它考慮到了企業(yè)應用資源的使用,比如數(shù)據(jù)的持久化、數(shù)據(jù)集成、事務處理、消息中間件、分布式式計算等高效可靠處理企業(yè)數(shù)據(jù)方法的技術抽象。

輕量級是相對于傳統(tǒng)J2EE而言的,傳統(tǒng)的J2EE開發(fā),需要依賴按照J2EE規(guī)范實現(xiàn)的J2EE應用服務器,設計和實現(xiàn)時,需要遵循一系列的接口標準,這種開發(fā)方式耦合性高,使應用在可測試性和部署上都有影響,對技術的理解和要求相對較高。

使用Spring進行開發(fā),對開發(fā)人員比較輕量,可以使用POJO和JavaBean的開發(fā)方式,使應用面向接口開發(fā),充分支持了面向?qū)ο蟮脑O計方法。通過IOC容器減少了直接耦合,通過AOP以動態(tài)和非侵入的方式增加了服務的功能,為靈活選取不同的服務實現(xiàn)提供了基礎,這也是Spring的核心。

開發(fā)過程中的共性問題,Spring封裝成了各種組件,而且Spring通過社區(qū),形成了一個開放的生態(tài)系統(tǒng),比如Spring Security就是來源于一個社區(qū)貢獻Acegi.

整體架構

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

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

Spring技術內(nèi)幕:設計理念和整體架構概述

核心容器

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

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

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

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

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

AOP和服務器工具

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

spring-instrument提供一些類級的工具支持和ClassLoader級的實現(xiàn),用于服務器。spring-instrument-tomcat針對tomcat的instrument實現(xiàn)。

消息組件

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

數(shù)據(jù)訪問/集成

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

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

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

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

spring-oxm模塊提供抽象層用于支持Object/XML maping的實現(xiàn),如JAXB、XStream等。

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

Web

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

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

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

spring-webmvc-portlet模塊提供了MVC模式的portlet實現(xiàn),protlet與Servlet的最大區(qū)別是請求的處理分為action和render階段,在一個請求中,action階段只執(zhí)行一次,但render階段可能由于用戶的瀏覽器操作而被執(zhí)行多次。

測試

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

各個子項目介紹

從配置到安全,從web應用到大數(shù)據(jù)——無論您的應用程序需要什么樣的基礎設施,都有一個Spring項目來幫助您構建它,Spring是模塊化的設計。

Spring Boot

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

Spring Cloud

為分布式系統(tǒng)開發(fā)提供工具集,基于Spring Boot,為基于JVM的云應用開發(fā)中的配置管理、服務發(fā)現(xiàn)、斷路器、智能路由、控制總線、全局鎖、決策競選、分布式會話、集群狀態(tài)管理等操作提供了一種簡單的開發(fā)方式,其下有很多子項目。

  • 分布式/版本化配置:Spring Cloud Config
  • 服務注冊和發(fā)現(xiàn):Netflix Eureka 或者 Spring Cloud Eureka(對前者的二次封裝)
  • 路由:Spring Cloud Zuul,基于 Netflix Zuul
  • service - to - service調(diào)用:Spring Cloud Feign
  • 負載均衡:Spring Cloud Ribbon 基于 Netflix Ribbon 實現(xiàn)
  • 斷路器:Spring Cloud Hystrix
  • 分布式消息傳遞:Spring Cloud Bus
Spring Cloud Data Flow

Data flow 是一個用于開發(fā)和執(zhí)行大范圍數(shù)據(jù)處理、批量運算、持續(xù)運算的統(tǒng)一編程模型和托管服務。

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

Spring Data

數(shù)據(jù)訪問模塊,提供了對JDBC及ORM很好的支持,隨著NOSQL和BigData的興起,出現(xiàn)了越來越多的新技術,比如非關系型數(shù)據(jù)庫、MapReduce框架,為了讓spring開發(fā)者能更方便地使用這些新技術,通過Spring Data,開發(fā)者可以用Spring提供的相對一致的方式訪問位于不同類型的數(shù)據(jù)存儲中的數(shù)據(jù)。

Spring技術內(nèi)幕:設計理念和整體架構概述

Spring Integration

在企業(yè)軟件開發(fā)過程中,經(jīng)常會遇到與外部系統(tǒng)集成,Spring Integration為Spring編程模型提供了一個支持企業(yè)集成模式的擴展,在應用程序中提供輕量級的消息機制,通過聲明式的適配器與外部系統(tǒng)進行集成。

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

  • Message:帶有元數(shù)據(jù)的Java對象;
  • Channel:傳遞消息的管道;
  • Message Endpoint:消息的處理端,在處理端可以對消息進行轉換、路由、過濾、拆分、聚合等操作;

還可以使用Channel Adapter,這是應用程序與外界交互的地方,輸入是Inbound、輸出則是Outbound,可選的連接類型有很多,比如AMQP、JDBC、Web Services、FTP、JMS、XMPP、多種NoSQL數(shù)據(jù)庫等等。只需通過簡單的配置文件就能將所有這些東西串聯(lián)在一起,實現(xiàn)復雜的集成工作。

Spring Batch

簡化及優(yōu)化大量數(shù)據(jù)的批處理操作,支持事務、并發(fā)、流程、監(jiān)控、縱向和橫向擴展,提供統(tǒng)一的接口管理和任務管理。

例如它提供了很多方法來讀取大型的文件(比如1GB的CSV、XML文件),在數(shù)據(jù)庫中加載或更新幾萬甚至幾十萬條記錄,如果直接select出所有記錄,以至于拖垮整個系統(tǒng),而使用了Spring Batch,框架會幫助他每次撈取一部分記錄進行分頁,在更新時分批進行提交。

Spring Security

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

它使用Servlet規(guī)范中的Filter保護Web請求并限制URL級別的訪問,還能夠使用Spring AOP保護方法調(diào)用——借助于對象代理和使用通知,能夠確保只有具備適當權限的用戶才能訪問安全保護的方法。

它非常靈活,能夠基于各種數(shù)據(jù)存儲來認證用戶。它內(nèi)置了多種常見的用戶存儲場景,如內(nèi)存、關系型數(shù)據(jù)庫以及LDAP,還可以編寫并插入自定義的用戶存儲實現(xiàn)。

Spring HATEOAS

先來理解HATEOAS:大家都聽過過REST,它的定位為「分布式超媒體應用」的架構風格,文中提到了HATEOAS(Hypermedia as the engine of application state)的概念,超媒體即應用狀態(tài)引擎,即返回結果中提供鏈接,連向其他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 插件即可生成最終的文檔,只要是規(guī)范的開發(fā)過程,文檔都會隨版本的每次發(fā)布而自動更新。

Spring Social

使用 Spring Social 的最大好處在于它已經(jīng)提供了對主流社交網(wǎng)站的支持,只需要簡單配置即可,對于一些不太常用的社交網(wǎng)站,也可以從社區(qū)中找到相應的組件。

Spring AMQP

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

Spring Web Flow

Spring Web Flow是Spring MVC 的擴展,它支持開發(fā)基于流程的應用程序。它將流程的定義與實現(xiàn)流程行為的類和視圖分離開來,具有同時處理多個HTTP請求、管理會話狀態(tài)、數(shù)據(jù)事務處理,支持AJAX來構建豐富的客戶端體驗,并且提供對JSF的支持。

Spring LDAP

Spring LDAP是一個用于操作LDAP的Java框架。它是基于Spring的JdbcTemplate模式,能夠幫助開發(fā)人員簡化操作。

Spring Session

Spring Session提供了一套創(chuàng)建和管理Servlet HttpSession的方案。Spring Session提供了集群Session功能,默認采用外置的Redis來存儲Session數(shù)據(jù),以此來解決Session共享的問題。

Spring Shell

Spring Shell提供交互式的Shell,可以讓你使用簡單的基于Spring的編程模型來開發(fā)命令。

Spring Kafka

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

Spring Statemachine

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

Spring IO Platform

可以認為是一個依賴維護平臺,該平臺將相關依賴匯聚到一起,針對每個依賴,都提供了一個版本號。

主要是解決依賴版本沖突問題,在使用Spring的時候,經(jīng)常會使用到第三方庫,一般大家都是根據(jù)經(jīng)驗挑選一個版本號或挑選最新的,風向較大,很容易沖突。

Spring IO Platform能很好地解決這些問題,我們在添加第三方依賴的時候,不需要寫版本號,它能夠自動幫我們挑選一個最優(yōu)的版本。

歡迎掃描下方二維碼,關注我的個人微信公眾號,查看更多文章 ~

Spring技術內(nèi)幕:設計理念和整體架構概述

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI