程序員都很崇拜技術(shù)大神,很大一部分是因?yàn)樗麄儼l(fā)現(xiàn)和解決問(wèn)題的能力,特別是線上出現(xiàn)緊急問(wèn)題時(shí),總是能夠快速定位和解決。
一方面,他們有深厚的技術(shù)基礎(chǔ),對(duì)應(yīng)用的技術(shù)知其所以然,另一方面,在采坑的過(guò)程中不斷總結(jié),積累了很多經(jīng)驗(yàn)。
相信大家都使用過(guò)Spring,有些人了解它的核心:IOC和AOP,但只是了解它們的基本概念、使用了反射和動(dòng)態(tài)代理,關(guān)于如何管理對(duì)象、代理的具體實(shí)現(xiàn)了解的比較淺。
有些人使用Spring MVC,使用Spring集成數(shù)據(jù)庫(kù)、事務(wù)、消息隊(duì)列以簡(jiǎn)化操作,但對(duì)集成的具體設(shè)計(jì)思路和實(shí)現(xiàn)了解的也比較淺。
我也這一塊也比較菜,所以,后面的一段時(shí)間會(huì)梳理和總結(jié)Spring相關(guān)的技術(shù)原理,以「Spring技術(shù)內(nèi)幕:深入解析Spring架構(gòu)與設(shè)計(jì)原理」書(shū)籍為核心,結(jié)合自己的使用經(jīng)驗(yàn)和疑問(wèn),以及網(wǎng)絡(luò)上大牛的文章,來(lái)補(bǔ)足自己這方面的缺失。
這本書(shū)作者是計(jì)文柯,以Spring源代碼為依托,從宏觀上揭示了Spring的設(shè)計(jì)思路和架構(gòu)思想,從微觀上剖析了Spring各功能模塊的實(shí)現(xiàn)原理和運(yùn)行機(jī)制。一方面希望讀者能通過(guò)深入了解Spring的底層機(jī)制來(lái)更好地解決實(shí)際開(kāi)發(fā)中遇到的各種難題,另一方面是希望讀者能吸收Spring設(shè)計(jì)和實(shí)現(xiàn)中的優(yōu)秀方法和思想。
全書(shū)共三部分,分別闡述了Spring的核心、組件和應(yīng)用。第一部分詳細(xì)分析了IOC容器和AOP實(shí)現(xiàn),第二部分闡述了基于Spring IOC容器和AOP的Java EE組件在Spring中的實(shí)現(xiàn),第三部分講述了一些基于Spring的典型應(yīng)用的實(shí)現(xiàn)。
本篇先對(duì)設(shè)計(jì)理念和整體架構(gòu)做個(gè)概述,從整體上看看Spring的設(shè)計(jì)目標(biāo)和架構(gòu),通過(guò)本篇,你會(huì)了解到:
設(shè)計(jì)目標(biāo)
簡(jiǎn)單來(lái)說(shuō),Spring的設(shè)計(jì)目標(biāo)是為我們提供一個(gè)一站式的輕量級(jí)應(yīng)用開(kāi)發(fā)平臺(tái),抽象了應(yīng)用開(kāi)發(fā)中遇到的共性問(wèn)題。
作為平臺(tái),它考慮到了企業(yè)應(yīng)用資源的使用,比如數(shù)據(jù)的持久化、數(shù)據(jù)集成、事務(wù)處理、消息中間件、分布式式計(jì)算等高效可靠處理企業(yè)數(shù)據(jù)方法的技術(shù)抽象。
輕量級(jí)是相對(duì)于傳統(tǒng)J2EE而言的,傳統(tǒng)的J2EE開(kāi)發(fā),需要依賴按照J(rèn)2EE規(guī)范實(shí)現(xiàn)的J2EE應(yīng)用服務(wù)器,設(shè)計(jì)和實(shí)現(xiàn)時(shí),需要遵循一系列的接口標(biāo)準(zhǔn),這種開(kāi)發(fā)方式耦合性高,使應(yīng)用在可測(cè)試性和部署上都有影響,對(duì)技術(shù)的理解和要求相對(duì)較高。
使用Spring進(jìn)行開(kāi)發(fā),對(duì)開(kāi)發(fā)人員比較輕量,可以使用POJO和JavaBean的開(kāi)發(fā)方式,使應(yīng)用面向接口開(kāi)發(fā),充分支持了面向?qū)ο蟮脑O(shè)計(jì)方法。通過(guò)IOC容器減少了直接耦合,通過(guò)AOP以動(dòng)態(tài)和非侵入的方式增加了服務(wù)的功能,為靈活選取不同的服務(wù)實(shí)現(xiàn)提供了基礎(chǔ),這也是Spring的核心。
開(kāi)發(fā)過(guò)程中的共性問(wèn)題,Spring封裝成了各種組件,而且Spring通過(guò)社區(qū),形成了一個(gè)開(kāi)放的生態(tài)系統(tǒng),比如Spring Security就是來(lái)源于一個(gè)社區(qū)貢獻(xiàn)Acegi.
整體架構(gòu)
從總體來(lái)看,Spring分為3層,最底層是核心層,包括IOC、AOP等核心模塊,中間層是封裝的JavaEE服務(wù)、作為中間的驅(qū)動(dòng)組件,最上層是各個(gè)應(yīng)用。
下圖是Spring官網(wǎng)的一個(gè)架構(gòu)圖,介紹下其組成部分:
由spring-core、spring-beans、spring-context、spring-context-support和spring-expression模塊組成:
spring-core和spring-beans提供框架的基礎(chǔ)部分,包括IOC功能,BeanFactory是一個(gè)復(fù)雜的工廠模式的實(shí)現(xiàn),將配置和特定的依賴從實(shí)際程序邏輯中解耦。
context模塊建立在core和beans模塊的基礎(chǔ)上,增加了對(duì)國(guó)際化的支持、事件廣播、資源加載和創(chuàng)建上下文,ApplicationContext是context模塊的重點(diǎn)。
spring-context-support提供對(duì)常見(jiàn)第三個(gè)庫(kù)的支持,集成到spring上下文中,比如緩存(ehcache,guava)、通信(javamail)、調(diào)度(commonj,quartz)、模板引擎等(freemarker,velocity)。
spring-expression模塊提供了一個(gè)強(qiáng)大的表達(dá)式語(yǔ)言用來(lái)在運(yùn)行時(shí)查詢和操作對(duì)象圖,這種語(yǔ)言支持對(duì)屬性值、屬性參數(shù)、方法調(diào)用、數(shù)組內(nèi)容存儲(chǔ)、集合和索引、邏輯和算數(shù)操作及命名變量,并且通過(guò)名稱從spring的控制反轉(zhuǎn)容器中取回對(duì)象。
AOP和服務(wù)器工具spring-aop模塊提供面向切面編程實(shí)現(xiàn),單獨(dú)的spring-aspects模塊提供了aspectj的集成和適用。
spring-instrument提供一些類級(jí)的工具支持和ClassLoader級(jí)的實(shí)現(xiàn),用于服務(wù)器。spring-instrument-tomcat針對(duì)tomcat的instrument實(shí)現(xiàn)。
消息組件spring框架4包含了spring-messaging模塊,從spring集成項(xiàng)目中抽象出來(lái),比如Messge、MessageChannel、MessageHandler及其他用來(lái)提供基于消息的基礎(chǔ)服務(wù)。
數(shù)據(jù)訪問(wèn)/集成數(shù)據(jù)訪問(wèn)和集成層由JDBC、ORM、OXM、JMS和事務(wù)模塊組成。
spring-jdbc模塊提供了不需要編寫(xiě)冗長(zhǎng)的JDBC代碼和解析數(shù)據(jù)庫(kù)廠商特有的錯(cuò)誤代碼的JDBC抽象出。
spring-tx模塊提供可編程和聲明式事務(wù)管理。
spring-orm模塊提供了領(lǐng)先的對(duì)象關(guān)系映射API集成層,如JPA、Hibernate等。
spring-oxm模塊提供抽象層用于支持Object/XML maping的實(shí)現(xiàn),如JAXB、XStream等。
spring-jms模塊包含生產(chǎn)和消費(fèi)消息的功能,從Spring4.1開(kāi)始提供集成spring-messaging模塊。
WebWeb層包含spring-web、spirng-webmvc、spring-websocket和spring-webmvc-portlet模塊組成。
spring-web模塊提供了基本的面向web開(kāi)發(fā)的集成功能,例如多文件上傳、使用servert listeners和web開(kāi)發(fā)應(yīng)用程序上下文初始化IOC容器。也包含HTTP客戶端以及spring遠(yuǎn)程訪問(wèn)的支持的web相關(guān)部分。
spring-webmvc包含spring的model-view-controller和REST web services 實(shí)現(xiàn)的Web應(yīng)用程序。
spring-webmvc-portlet模塊提供了MVC模式的portlet實(shí)現(xiàn),protlet與Servlet的最大區(qū)別是請(qǐng)求的處理分為action和render階段,在一個(gè)請(qǐng)求中,action階段只執(zhí)行一次,但render階段可能由于用戶的瀏覽器操作而被執(zhí)行多次。
測(cè)試spring-test模塊支持通過(guò)組合Junit或TestNG來(lái)進(jìn)行單元測(cè)試和集成測(cè)試,提供了連續(xù)的加載ApplicationContext并且緩存這些上下文。
各個(gè)子項(xiàng)目介紹
從配置到安全,從web應(yīng)用到大數(shù)據(jù)——無(wú)論您的應(yīng)用程序需要什么樣的基礎(chǔ)設(shè)施,都有一個(gè)Spring項(xiàng)目來(lái)幫助您構(gòu)建它,Spring是模塊化的設(shè)計(jì)。
Spring Boot簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,使用特定的方式進(jìn)行配置,使開(kāi)發(fā)人員不再需要定義樣板化的配置,實(shí)現(xiàn)快速開(kāi)發(fā)。
Spring Cloud為分布式系統(tǒng)開(kāi)發(fā)提供工具集,基于Spring Boot,為基于JVM的云應(yīng)用開(kāi)發(fā)中的配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、控制總線、全局鎖、決策競(jìng)選、分布式會(huì)話、集群狀態(tài)管理等操作提供了一種簡(jiǎn)單的開(kāi)發(fā)方式,其下有很多子項(xiàng)目。
Data flow 是一個(gè)用于開(kāi)發(fā)和執(zhí)行大范圍數(shù)據(jù)處理、批量運(yùn)算、持續(xù)運(yùn)算的統(tǒng)一編程模型和托管服務(wù)。
Spring Cloud Data Flow 是基于原生云對(duì)Spring XD的重新設(shè)計(jì),項(xiàng)目目標(biāo)是簡(jiǎn)化大數(shù)據(jù)應(yīng)用的開(kāi)發(fā)。Spring XD的流處理和批處理模塊的重構(gòu)分別基于spring boot的stream和task/batch的微服務(wù)程序。這些程序原生的支持像 Apache YARN、Apache Mesos和Kubernetes等現(xiàn)代運(yùn)行環(huán)境,都是自動(dòng)部署單元。
Spring Data數(shù)據(jù)訪問(wèn)模塊,提供了對(duì)JDBC及ORM很好的支持,隨著NOSQL和BigData的興起,出現(xiàn)了越來(lái)越多的新技術(shù),比如非關(guān)系型數(shù)據(jù)庫(kù)、MapReduce框架,為了讓spring開(kāi)發(fā)者能更方便地使用這些新技術(shù),通過(guò)Spring Data,開(kāi)發(fā)者可以用Spring提供的相對(duì)一致的方式訪問(wèn)位于不同類型的數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)。
在企業(yè)軟件開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到與外部系統(tǒng)集成,Spring Integration為Spring編程模型提供了一個(gè)支持企業(yè)集成模式的擴(kuò)展,在應(yīng)用程序中提供輕量級(jí)的消息機(jī)制,通過(guò)聲明式的適配器與外部系統(tǒng)進(jìn)行集成。
Spring Integraton中有幾個(gè)基本的概念:
還可以使用Channel Adapter,這是應(yīng)用程序與外界交互的地方,輸入是Inbound、輸出則是Outbound,可選的連接類型有很多,比如AMQP、JDBC、Web Services、FTP、JMS、XMPP、多種NoSQL數(shù)據(jù)庫(kù)等等。只需通過(guò)簡(jiǎn)單的配置文件就能將所有這些東西串聯(lián)在一起,實(shí)現(xiàn)復(fù)雜的集成工作。
Spring Batch簡(jiǎn)化及優(yōu)化大量數(shù)據(jù)的批處理操作,支持事務(wù)、并發(fā)、流程、監(jiān)控、縱向和橫向擴(kuò)展,提供統(tǒng)一的接口管理和任務(wù)管理。
例如它提供了很多方法來(lái)讀取大型的文件(比如1GB的CSV、XML文件),在數(shù)據(jù)庫(kù)中加載或更新幾萬(wàn)甚至幾十萬(wàn)條記錄,如果直接select出所有記錄,以至于拖垮整個(gè)系統(tǒng),而使用了Spring Batch,框架會(huì)幫助他每次撈取一部分記錄進(jìn)行分頁(yè),在更新時(shí)分批進(jìn)行提交。
Spring Security一款Spring的認(rèn)證和安全工具。其前身是Acegi,目標(biāo)是為Spring應(yīng)用提供一個(gè)安全服務(wù),比如用戶認(rèn)證、授權(quán)等。
它使用Servlet規(guī)范中的Filter保護(hù)Web請(qǐng)求并限制URL級(jí)別的訪問(wèn),還能夠使用Spring AOP保護(hù)方法調(diào)用——借助于對(duì)象代理和使用通知,能夠確保只有具備適當(dāng)權(quán)限的用戶才能訪問(wèn)安全保護(hù)的方法。
它非常靈活,能夠基于各種數(shù)據(jù)存儲(chǔ)來(lái)認(rèn)證用戶。它內(nèi)置了多種常見(jiàn)的用戶存儲(chǔ)場(chǎng)景,如內(nèi)存、關(guān)系型數(shù)據(jù)庫(kù)以及LDAP,還可以編寫(xiě)并插入自定義的用戶存儲(chǔ)實(shí)現(xiàn)。
Spring HATEOAS先來(lái)理解HATEOAS:大家都聽(tīng)過(guò)過(guò)REST,它的定位為「分布式超媒體應(yīng)用」的架構(gòu)風(fēng)格,文中提到了HATEOAS(Hypermedia as the engine of application state)的概念,超媒體即應(yīng)用狀態(tài)引擎,即返回結(jié)果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么。
比如獲取一篇文章,非HATEOAS的響應(yīng)例子是:
而HATEOAS的響應(yīng)例子是:
{ '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' } ] }
為了簡(jiǎn)化簽入或獲取超鏈接等操作,Spring HATEOAS提供了相關(guān)的支持。
Spring Rest DOCS可以生成準(zhǔn)確可讀的RESTful Service文檔,Spring 官方文檔都是用Spring REST Docs生成的。
基于單元測(cè)試生成文檔片段,不會(huì)侵入到源碼中,所以就不會(huì)使得源碼變得越來(lái)越臃腫,支持markdown,修改一行配置代碼即可支持生成 MarkDown 語(yǔ)法的文檔片段。
默認(rèn)的,在構(gòu)建的時(shí)候,會(huì)首先運(yùn)行單元測(cè)試,便生成了文檔片段,然后在打包時(shí),通過(guò)添加 asciidoctor-maven-plugin 插件即可生成最終的文檔,只要是規(guī)范的開(kāi)發(fā)過(guò)程,文檔都會(huì)隨版本的每次發(fā)布而自動(dòng)更新。
Spring Social使用 Spring Social 的最大好處在于它已經(jīng)提供了對(duì)主流社交網(wǎng)站的支持,只需要簡(jiǎn)單配置即可,對(duì)于一些不太常用的社交網(wǎng)站,也可以從社區(qū)中找到相應(yīng)的組件。
Spring AMQP基于Spring框架的AMQP消息解決方案,提供模板化的發(fā)送和接收消息的抽象層,提供基于消息驅(qū)動(dòng)的POJO,使在Spring應(yīng)用中使用AMQP消息服務(wù)器變得更為簡(jiǎn)單,SpringSource旗下的Rabbit MQ就是一個(gè)開(kāi)源的基于AMQP的消息服務(wù)器。
Spring Web FlowSpring Web Flow是Spring MVC 的擴(kuò)展,它支持開(kāi)發(fā)基于流程的應(yīng)用程序。它將流程的定義與實(shí)現(xiàn)流程行為的類和視圖分離開(kāi)來(lái),具有同時(shí)處理多個(gè)HTTP請(qǐng)求、管理會(huì)話狀態(tài)、數(shù)據(jù)事務(wù)處理,支持AJAX來(lái)構(gòu)建豐富的客戶端體驗(yàn),并且提供對(duì)JSF的支持。
Spring LDAPSpring LDAP是一個(gè)用于操作LDAP的Java框架。它是基于Spring的JdbcTemplate模式,能夠幫助開(kāi)發(fā)人員簡(jiǎn)化操作。
Spring SessionSpring Session提供了一套創(chuàng)建和管理Servlet HttpSession的方案。Spring Session提供了集群Session功能,默認(rèn)采用外置的Redis來(lái)存儲(chǔ)Session數(shù)據(jù),以此來(lái)解決Session共享的問(wèn)題。
Spring ShellSpring Shell提供交互式的Shell,可以讓你使用簡(jiǎn)單的基于Spring的編程模型來(lái)開(kāi)發(fā)命令。
Spring Kafkaspring for kafka對(duì)原生的kafka client consumer的封裝與集成。
Spring Statemachine它的主要功能是幫助開(kāi)發(fā)者簡(jiǎn)化狀態(tài)機(jī)的開(kāi)發(fā)過(guò)程,讓狀態(tài)機(jī)結(jié)構(gòu)更加層次化。
Spring IO Platform可以認(rèn)為是一個(gè)依賴維護(hù)平臺(tái),該平臺(tái)將相關(guān)依賴匯聚到一起,針對(duì)每個(gè)依賴,都提供了一個(gè)版本號(hào)。
主要是解決依賴版本沖突問(wèn)題,在使用Spring的時(shí)候,經(jīng)常會(huì)使用到第三方庫(kù),一般大家都是根據(jù)經(jīng)驗(yàn)挑選一個(gè)版本號(hào)或挑選最新的,風(fēng)向較大,很容易沖突。
Spring IO Platform能很好地解決這些問(wèn)題,我們?cè)谔砑拥谌揭蕾嚨臅r(shí)候,不需要寫(xiě)版本號(hào),它能夠自動(dòng)幫我們挑選一個(gè)最優(yōu)的版本。
關(guān)注私信發(fā)送暗號(hào)555,可獲取Java架構(gòu)進(jìn)階資料哦
聯(lián)系客服