2018-04-30

spring源碼分析(一)



目錄

一介却、Spring概述
二讨韭、一切從Bean開始
--2.1、Spring設(shè)計(jì)伊始
--2.2雳灾、面向Bean
--2.3漠酿、依賴注入
--2.4、面向切面
--2.5谎亩、常用的設(shè)計(jì)模式
--2.6、常用設(shè)計(jì)模式應(yīng)用場景(特點(diǎn))總結(jié)
三宇姚、俯瞰Spring架構(gòu)設(shè)計(jì)
--3.1匈庭、系統(tǒng)架構(gòu)
--3.2、依賴關(guān)系
四浑劳、Spring思想應(yīng)用場景(特點(diǎn))



一阱持、Spring 概述

Spring 是一個(gè)開源的輕量級(jí) JavaSE(Java 標(biāo)準(zhǔn)版本)/Java EE(Java 企業(yè)版本)開發(fā)應(yīng)用框架,其目的是用于 簡化企業(yè)級(jí)應(yīng)用程序開發(fā)魔熏。應(yīng)用程序是由一組相互協(xié)作的對象組成衷咽。而在傳統(tǒng)應(yīng)用程序開發(fā)中,一個(gè)完整的應(yīng)用是由 一組相互協(xié)作的對象組成蒜绽。所以開發(fā)一個(gè)應(yīng)用除了要開發(fā)業(yè)務(wù)邏輯之外镶骗,最多的是關(guān)注如何使這些對象協(xié)作來完成所 需功能,而且要低耦合躲雅、高內(nèi)聚鼎姊。業(yè)務(wù)邏輯開發(fā)是不可避免的,那如果有個(gè)框架出來幫我們來創(chuàng)建對象及管理這些對 象之間的依賴關(guān)系相赁∠嗫埽可能有人說了,比如“抽象工廠钮科、工廠方法設(shè)計(jì)模式”不也可以幫我們創(chuàng)建對象唤衫,“生成器模式”幫 我們處理對象間的依賴關(guān)系,不也能完成這些功能嗎绵脯?可是這些又需要我們創(chuàng)建另一些工廠類佳励、生成器類,我們又要 而外管理這些類桨嫁,增加了我們的負(fù)擔(dān)植兰,如果能有種通過配置方式來創(chuàng)建對象,管理對象之間依賴關(guān)系璃吧,我們不需要通 過工廠和生成器來創(chuàng)建及管理對象之間的依賴關(guān)系楣导,這樣我們是不是減少了許多工作,加速了開發(fā)畜挨,能節(jié)省出很多時(shí) 間來干其他事筒繁。Spring 框架剛出來時(shí)主要就是來完成這個(gè)功能噩凹。

Spring 框架除了幫我們管理對象及其依賴關(guān)系,還提供像通用日志記錄毡咏、性能統(tǒng)計(jì)驮宴、安全控制、異常處理等面向切面 的能力呕缭,還能幫我管理最頭疼的數(shù)據(jù)庫事務(wù)堵泽,本身提供了一套簡單的 JDBC 訪問實(shí)現(xiàn),提供與第三方數(shù)據(jù)訪問框架集 成(如 Hibernate恢总、JPA)迎罗,與各種 JavaEE 技術(shù)整合(如 JavaMail、任務(wù)調(diào)度等等)片仿,提供一套自己的 web 層框 架 Spring MVC纹安、而且還能非常簡單的與第三方 web 框架集成。從這里我們可以認(rèn)為 Spring 是一個(gè)超級(jí)粘合平臺(tái)砂豌, 除了自己提供功能外厢岂,還提供粘合其他技術(shù)和框架的能力,從而使我們可以更自由的選擇到底使用什么技術(shù)進(jìn)行開發(fā)阳距。 而且不管是 JAVA SE(C/S 架構(gòu))應(yīng)用程序還是 JAVA EE(B/S 架構(gòu))應(yīng)用程序都可以使用這個(gè)平臺(tái)進(jìn)行開發(fā)塔粒。讓 我們來深入看一下 Spring 到底能幫我們做些什么?

二娄涩、一切從 Bean 開始

1996窗怒, Java 還只是一個(gè)新興的、初出茅廬的編程語言蓄拣。人們之所以關(guān)注她僅僅是因?yàn)檠镄椋梢允褂?Java 的 Applet 來開發(fā) Web 應(yīng)用。但這些開發(fā)者很快就發(fā)現(xiàn)這個(gè)新興的語言還能做更多的事情球恤。與之前的所 有語言不同辜昵,Java 讓模塊化構(gòu)建復(fù)雜的系統(tǒng)成為可能(當(dāng)時(shí)的軟件行業(yè)雖然在業(yè)務(wù)上突飛猛進(jìn),但當(dāng)時(shí) 開發(fā)用的是傳統(tǒng)的面向過程開發(fā)思想咽斧,軟件的開發(fā)效率一直踟躕不前堪置。伴隨著業(yè)務(wù)復(fù)雜性的不斷加深, 開發(fā)也變得越發(fā)困難张惹。其實(shí)舀锨,當(dāng)時(shí)也是面向?qū)ο笏枷腼w速發(fā)展的時(shí)期,她在 80 年代末被提出宛逗,成熟于 90 年代坎匿,現(xiàn)今大多數(shù)編程語言都是面向?qū)ο蟮模?dāng)然這是后話了)。他們?yōu)?Applet 而來替蔬,為組件化而 留告私。這便是最早的 Java。

同樣在這一年的 12 月承桥, Sun 公司發(fā)布了當(dāng)時(shí)還名不見經(jīng)傳但后來人盡皆知的 JavaBean 1.00-A 規(guī)范驻粟。 早期的 JavaBean 規(guī)范針對于 Java,她定義了軟件組件模型凶异。這個(gè)規(guī)范規(guī)定了一整套編碼策略蜀撑,使簡單 的 Java 對象不僅可以被重用,而且還可以輕松地構(gòu)建更為復(fù)雜的應(yīng)用唠帝。盡管 JavaBean 最初是為重用應(yīng) 用組件而設(shè)計(jì)的屯掖,但當(dāng)時(shí)他們卻是主要用作構(gòu)建窗體控件,畢竟在 PC 時(shí)代那才是主流襟衰。但相比于當(dāng)時(shí) 正如日中天的 Delphi、VB 和 C++粪摘,他看起來還是太簡易了瀑晒,以至于無法勝任任何"實(shí)際的"工作。

復(fù)雜的應(yīng)用通常需要諸如事物徘意、安全苔悦、分布式等服務(wù)的支持,但 JavaBean 并未直接提供椎咧。所以到了 1998 年 3 月玖详,Sun 發(fā)布了 EJB 1.0 規(guī)范,該規(guī)范把 Java 組件的設(shè)計(jì)理念延伸到了服務(wù)器端勤讽,并提供了 許多必須的企業(yè)級(jí)服務(wù)蟋座,但他也不再像早期的 JavaBean 那么簡單了。實(shí)際上脚牍,除了名字向臀,EJB Bean 已 經(jīng)和 JavaBean 沒有任何關(guān)系了。

盡管現(xiàn)實(shí)中有很多系統(tǒng)是基于 EJB 構(gòu)建的诸狭,但 EJB 從來沒有實(shí)現(xiàn)它最初的設(shè)想:簡化開發(fā)券膀。EJB 的 聲明式編程模型的確簡化了很多基礎(chǔ)架構(gòu)層面的開發(fā),例如事務(wù)和安全驯遇;但另一方面 EJB 在部署描述符 和配套代碼實(shí)現(xiàn)等方面變得異常復(fù)雜芹彬。隨著時(shí)間的推移,很多開發(fā)者對 EJB 已經(jīng)不再抱有幻想叉庐,開始尋 求更簡潔的方法舒帮。

現(xiàn)在 Java 組件開發(fā)理念重新回歸正軌。新的編程技術(shù) AOP 和 DI 的不斷出現(xiàn),他們?yōu)?JavaBean 提供 了之前 EJB 才能擁有的強(qiáng)大功能会前。這些技術(shù)為 POJO 提供了類似 EJB 的聲明式編程模型好乐,而沒有引入任 何 EJB 的復(fù)雜性。當(dāng)簡單的 JavaBean 足以勝任時(shí)瓦宜,人們便不愿編寫笨重的 EJB 組件了蔚万。

客觀地講,EJB 的發(fā)展甚至促進(jìn)了基于 POJO 的編程模型临庇。引入新的理念反璃,最新的 EJB 規(guī)范相比之前 的規(guī)范有了前所未有的簡化,但對很多開發(fā)者而言假夺,這一切的一切都來得太遲了淮蜈。到了 EJB 3 規(guī)范發(fā)布 時(shí),其他基于 POJO 的開發(fā)架構(gòu)已經(jīng)成為事實(shí)的標(biāo)準(zhǔn)了已卷,而 Spring 框架也是在這樣的大環(huán)境下出現(xiàn)的梧田。

2.1、Spring 設(shè)計(jì)伊始

Spring 是為解決企業(yè)級(jí)應(yīng)用開發(fā)的復(fù)雜性而設(shè)計(jì)侧蘸,她可以做很多事裁眯。但歸根到底支撐 Spring 的僅 僅是少許的基本理念,而所有地這些的基本理念都能可以追溯到一個(gè)最根本的使命:簡化開發(fā)讳癌。這是一 個(gè)鄭重的承諾穿稳,其實(shí)許多框架都聲稱在某些方面做了簡化。

而 Spring 則立志于全方面的簡化 Java 開發(fā)晌坤。對此逢艘,她主要采取了 4 個(gè)關(guān)鍵策略:

  • 基于 POJO 的輕量級(jí)和最小侵入性編程;

  • 通過依賴注入和面向接口松耦合骤菠;

  • 基于切面和慣性進(jìn)行聲明式編程它改;

  • 通過切面和模板減少樣板式代碼;

而他主要是通過:面向 Bean娩怎、依賴注入以及面向切面這三種方式來達(dá)成的搔课。

2.2、面向 Bean

Spring 是面向 Bean 的編程(Bean Oriented Programming, BOP)截亦,Bean 在 Spring 中才是真正 的主角爬泥。Bean 在 Spring 中作用就像 Object 對 OOP 的意義一樣,Spring 中沒有 Bean 也就沒有 Spring 存在的意義崩瓤。Spring 提供了 IOC 容器通過配置文件或者注解的方式來管理對象之間的依賴關(guān) 系袍啡。

控制反轉(zhuǎn)(其中最常見的方式叫做依賴注入(Dependency Injection,DI)却桶,還有一種方式叫“依賴 查找”(Dependency Lookup境输,DL)蔗牡,她在 C++、Java嗅剖、PHP 以及.NET 中都運(yùn)用辩越。在最早的 Spring 中是 包含有依賴注入方法和依賴查詢的,但因?yàn)橐蕾嚥樵兪褂妙l率過低信粮,不久就被 Spring 移除了黔攒,所以在 Spring 中控制反轉(zhuǎn)也被稱作依賴注入),她的基本概念是:不創(chuàng)建對象强缘,但是描述創(chuàng)建它們的方式督惰。在 代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)旅掂。容器 (在 Spring 框架中是 IOC 容器) 負(fù)責(zé)將這些聯(lián)系在一起赏胚。

在典型的 IOC 場景中,容器創(chuàng)建了所有對象商虐,并設(shè)置必要的屬性將它們連接在一起觉阅,決定什么時(shí)間 調(diào)用方法。

2.3秘车、依賴注入

Spring 設(shè)計(jì)的核心 org.springframework.beans 包(架構(gòu)核心是 org.springframework.core 包)留拾, 它的設(shè)計(jì)目標(biāo)是與 JavaBean 組件一起使用。這個(gè)包通常不是由用戶直接使用鲫尊,而是由服務(wù)器將其用作 其他多數(shù)功能的底層中介。下一個(gè)最高級(jí)抽象是 BeanFactory 接口沦偎,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn)疫向,允許 通過名稱創(chuàng)建和檢索對象。BeanFactory 也可以管理對象之間的關(guān)系豪嚎。

BeanFactory 支持兩個(gè)對象模型搔驼。

  • 單例:模型提供了具有特定名稱的對象的共享實(shí)例,可以在查詢時(shí)對其進(jìn)行檢索侈询。Singleton 是 默認(rèn)的也是最常用的對象模型舌涨。對于無狀態(tài)服務(wù)對象很理想。

  • 原型:模型確保每次檢索都會(huì)創(chuàng)建單獨(dú)的對象扔字。在每個(gè)用戶都需要自己的對象時(shí)囊嘉,原型模型最適 合。

bean 工廠的概念是 Spring 作為 IOC 容器的基礎(chǔ)革为。 IOC 則將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到 框架扭粱。

2.4、面向切面

面向切面編程震檩,即 AOP琢蛤,是一種編程思想蜓堕,它允許程序員對橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的 行為(例如日志和事務(wù)管理)進(jìn)行模塊化。AOP 的核心構(gòu)造是方面(切面)博其,它將那些影響多個(gè)類的行 為封裝到可重用的模塊中套才。

AOP 和 IOC 是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開發(fā)中的復(fù)雜問題慕淡。在典型 的面向?qū)ο箝_發(fā)方式中背伴,可能要將日志記錄語句放在所有方法和 Java 類中才能實(shí)現(xiàn)日志功能。在 AOP 方式中儡率,可以反過來將日志服務(wù)模塊化挂据,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當(dāng)然儿普,優(yōu)勢 就是 Java 類不需要知道日志服務(wù)的存在崎逃,也不需要考慮相關(guān)的代碼。所以眉孩,用 Spring AOP 編寫的應(yīng) 用程序代碼是松散耦合的个绍。

AOP 的功能完全集成到了 Spring 事務(wù)管理、日志和其他各種特性的上下文中浪汪。

應(yīng)用場景

  • Authentication 權(quán)限認(rèn)證

  • Logging 日志

  • Transctions Manager 事務(wù)

  • Lazy Loading 懶加載

  • Context Process 上下文處理

  • Error Handler 錯(cuò)誤跟蹤(異常捕獲機(jī)制)

  • Cache 緩存

2.5巴柿、常用的設(shè)計(jì)模式

代理模式:

動(dòng)態(tài)代理

  • JDK 動(dòng)態(tài)代理:

  • CGLib 動(dòng)態(tài)代理:

cglib.jar (全稱 Code Generation Library 代碼生成庫)

asm.jar(全稱 assembly,裝配)

特點(diǎn):

  • 執(zhí)行者死遭、被代理人

  • 對于被代理人來說广恢,這件事情是一定要做的,但是我自己又不想做或者沒有時(shí)間做呀潭,找代理钉迷。

  • 需要獲取到被代理的人個(gè)人資料。

窮舉法:

  • 租房中介:中介和你

  • 火車票黃牛:黃牛和你

  • 媒人:媒婆和你

  • 明星經(jīng)紀(jì)人:經(jīng)紀(jì)人和明星

  • 劉德華要開演唱會(huì)(長沙)钠署、準(zhǔn)備工作和善后工作

  • 快遞:

總結(jié):

做了一件什么事情呢糠聪? 字節(jié)碼重組
可以做一件什么事情? 可以在每一個(gè)方法調(diào)用之前加一些代碼谐鼎,在方法調(diào)用之后再加一些代碼

工廠模式:

特點(diǎn):

  • 隱藏復(fù)雜的邏輯處理過程舰蟆,只關(guān)心執(zhí)行結(jié)果。

分類:

  • 簡單工廠狸棍、工廠方法身害、抽象工廠

單例模式

特點(diǎn):

1、保證從系統(tǒng)啟動(dòng)到系統(tǒng)終止隔缀,全過程只會(huì)產(chǎn)生一個(gè)實(shí)例题造。
2、當(dāng)我們在應(yīng)用中遇到功能性沖突的時(shí)候猾瘸,需要使用單例模式界赔。

窮例法:

  • 配置文件:如果不是單例(針對于某一種功能的配置)(兩個(gè)配置文件中的內(nèi)容一樣的丢习,則有一個(gè)是浪費(fèi)的。如果是不一樣的淮悼,我們就不知道以哪個(gè)為準(zhǔn)了)

  • 直接上級(jí)領(lǐng)導(dǎo):(對于你來說咐低,如果有多個(gè)領(lǐng)導(dǎo),你到底聽誰的袜腥? 選擇恐懼癥)

  • 日歷:(不嚴(yán)謹(jǐn))在中國见擦,是有兩種日歷同時(shí)存在的

  • 陰歷(農(nóng)歷,一般用于指導(dǎo)農(nóng)業(yè)生產(chǎn)羹令,二十四節(jié)氣)

  • 和陽歷(公歷鲤屡,一般用于國際交流、企事業(yè)單位的工作指導(dǎo))

委派模式:

干活是我的福侈,功勞是你的,要和代理模式區(qū)分開來

窮例:

  • 兩個(gè)角色,受托人酒来,委托人(社會(huì)上是平等關(guān)系)
  • 公司里面:項(xiàng)目經(jīng)理,普通員工(法律上平等的肪凛,工作的關(guān)系堰汉,各自的職責(zé)會(huì)不一樣)

  • 項(xiàng)目經(jīng)理(委托人):主要職責(zé)是安排任務(wù)

  • 普通員工(受托人):執(zhí)行任務(wù)

特點(diǎn):

1、類似于中介的功能(委托機(jī)制)伟墙;
2翘鸭、持有被委托人的引用。
3戳葵、不關(guān)心過程就乓,只關(guān)心結(jié)果。

好處:

  • 主要目的就是隱藏具體實(shí)現(xiàn)邏輯

  • 保證結(jié)果的多樣性拱烁,對于用戶來是只有一種方法.比如,IOC 容器中档址,有一個(gè) Register 的東西(為了告訴我們的容器,在這個(gè)類被初始化的過程中邻梆,需要做很多 不同的邏輯處理,需要實(shí)現(xiàn)多個(gè)任務(wù)執(zhí)行者绎秒,分別實(shí)現(xiàn)各自的功能)

策略模式:過程不同浦妄,但結(jié)果一樣。

原型模式:數(shù)據(jù)內(nèi)容完全一樣见芹,但實(shí)例不同剂娄。

模板模式:執(zhí)行流程固定,但中間有些步驟有細(xì)微差別玄呛。

2.6阅懦、常用設(shè)計(jì)模式 應(yīng)用場景(特點(diǎn))總結(jié)

代理模式

辦事要求人

1、兩個(gè)參與角色:執(zhí)行者徘铝、被代理人耳胎。

2惯吕、對于被代理人來說,這件事情是一定要做的怕午,但是我自己又不 想做或者沒有時(shí)間做废登,找代理。

3郁惜、需要獲取到被代理的人個(gè)人資料堡距。

工廠模式

只對結(jié)果負(fù)責(zé),不要 三無產(chǎn)品

1兆蕉、對調(diào)用者隱藏復(fù)雜的邏輯處理過程羽戒,調(diào)用者只關(guān)心執(zhí)行結(jié)果。

2虎韵、工廠要對結(jié)果負(fù)責(zé)易稠,保證生產(chǎn)出符合規(guī)范的產(chǎn)品。

單例模式

保證獨(dú)一無二

1劝术、保證從系統(tǒng)啟動(dòng)到系統(tǒng)終止缩多,全過程只會(huì)產(chǎn)生一個(gè)實(shí)例。

2养晋、當(dāng)我們在應(yīng)用中遇到功能性沖突的時(shí)候衬吆,需要使用單例模式。

委派模式

干活是你的(普通員工)绳泉,功勞是我的(項(xiàng)目經(jīng)理)

1逊抡、兩個(gè)參與角色,委托人和被委托人零酪。

2冒嫡、委托人和被委托人在權(quán)利上完全平等(即實(shí)現(xiàn)同一個(gè)接口)

3、委托人持有被委托人的引用四苇。

4孝凌、不關(guān)心過程,只關(guān)心結(jié)果月腋。

策略模式

我行我素蟀架,只看結(jié)果。

1榆骚、執(zhí)行最終結(jié)果一樣片拍。

2、執(zhí)行過程和執(zhí)行邏輯不一樣妓肢。

原型模式

拔一根猴毛捌省,吹出千 萬個(gè)。

1碉钠、首先有一個(gè)原型纲缓。

2卷拘、數(shù)據(jù)內(nèi)容相同,但對象實(shí)例不同(完全兩個(gè)不同的內(nèi)存地址)色徘。

模板模式

執(zhí)行流程固定恭金,但中間有些步驟有細(xì)微差別。 流程標(biāo)準(zhǔn)化褂策,原料自 己加横腿。

三、俯瞰 Spring 架構(gòu)設(shè)計(jì)

3.1斤寂、系統(tǒng)架構(gòu)

Spring 總共大約有 20 個(gè)模塊耿焊,由 1300 多個(gè)不同的文件構(gòu)成。而這些組件被分別整合在核心容器 (Core Container)遍搞、AOP(Aspect Oriented Programming)和設(shè)備支持(Instrmentation)罗侯、數(shù)據(jù)訪問及集成(Data Access/Integeration)、Web溪猿、報(bào)文發(fā)送(Messaging)钩杰、Test,6 個(gè)模塊集合中诊县。以下是 Spring 4 的系統(tǒng)架構(gòu)圖讲弄。


spring架構(gòu)圖.PNG

組成 Spring 框架的每個(gè)模塊集合或者模塊都可以單獨(dú)存在,也可以一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)依痊。每 個(gè)模塊的組成和功能如下:

1.核心容器:由 spring-beans避除、spring-corespring-contextspring-expression(Spring Expression Language, SpEL) 4 個(gè)模塊組成胸嘁。

  • spring-beansspring-core 模塊是 Spring 框架的核心模塊瓶摆,包含了控制反轉(zhuǎn)(Inversion of Control, IOC)和依賴注入(Dependency Injection, DI)。BeanFactory 接口是 Spring 框架中的核 心接口性宏,它是工廠模式的具體實(shí)現(xiàn)群井。BeanFactory 使用控制反轉(zhuǎn)對應(yīng)用程序的配置和依賴性規(guī)范與實(shí) 際的應(yīng)用程序代碼進(jìn)行了分離。但 BeanFactory 容器實(shí)例化后并不會(huì)自動(dòng)實(shí)例化 Bean毫胜,只有當(dāng) Bean 被使用時(shí) BeanFactory 容器才會(huì)對該 Bean 進(jìn)行實(shí)例化與依賴關(guān)系的裝配蝌借。

  • spring-contest 模塊構(gòu)架于核心模塊之上,他擴(kuò)展了 BeanFactory指蚁,為她添加了 Bean 生命周期控制、 框架事件體系以及資源加載透明化等功能自晰。此外該模塊還提供了許多企業(yè)級(jí)支持凝化,如郵件訪問、遠(yuǎn)程訪 問酬荞、任務(wù)調(diào)度等搓劫, ApplicationContext 是該模塊的核心接口瞧哟,她是 BeanFactory 的超類,與 BeanFactory 不同枪向,ApplicationContext 容器實(shí)例化后會(huì)自動(dòng)對所有的單實(shí)例 Bean 進(jìn)行實(shí)例化與依賴關(guān)系的裝配勤揩, 使之處于待用狀態(tài)。

  • spring-expression 模塊是統(tǒng)一表達(dá)式語言(unified EL)的擴(kuò)展模塊秘蛔,可以查詢陨亡、管理運(yùn)行中的 對象,同時(shí)也方便的可以調(diào)用對象方法深员、操作數(shù)組负蠕、集合等。它的語法類似于傳統(tǒng) EL倦畅,但提供了額外的 功能遮糖,最出色的要數(shù)函數(shù)調(diào)用和簡單字符串的模板函數(shù)。這種語言的特性是基于 Spring 產(chǎn)品的需求而 設(shè)計(jì)叠赐,他可以非常方便地同 Spring IoC 進(jìn)行交互欲账。

2.AOP 和設(shè)備支持:由 spring-aopspring-aspectsspring-instrumentation3 個(gè)模塊組成芭概。

  • spring-aop 是 Spring 的另一個(gè)核心模塊赛不,是 Aop 主要的實(shí)現(xiàn)模塊。作為繼 OOP 后谈山,對程序員影響 最大的編程思想之一俄删,Aop 極大地開拓了人們對于編程的思路。在 Spring 中奏路,他是以 JVM 的動(dòng)態(tài)代理技 術(shù)為基礎(chǔ)畴椰,然后設(shè)計(jì)出了一系列的 Aop 橫切實(shí)現(xiàn),比如前置通知鸽粉、返回通知斜脂、異常通知等,同時(shí)触机, Pointcut 接口來匹配切入點(diǎn)帚戳,可以使用現(xiàn)有的切入點(diǎn)來設(shè)計(jì)橫切面,也可以擴(kuò)展相關(guān)方法根據(jù)需求進(jìn)行切入儡首。

  • spring-aspects模塊集成自 AspectJ 框架片任,主要是為 Spring Aop 提供多種 Aop 實(shí)現(xiàn)方法。

  • spring-instrumentation 模塊是基于 JAVA SE 中的"java.lang.instrument"進(jìn)行設(shè)計(jì)的蔬胯,應(yīng)該算是 Aop 的一個(gè)支援模塊对供,主要作用是在 JVM 啟用時(shí),生成一個(gè)代理類,程序員通過代理類在運(yùn)行時(shí)修改類 的字節(jié)产场,從而改變一個(gè)類的功能鹅髓,實(shí)現(xiàn) Aop 的功能。在分類里京景,我把他分在了 Aop 模塊下窿冯,在 Spring 官 方文檔里對這個(gè)地方也有點(diǎn)含糊不清,這里是純個(gè)人觀點(diǎn)确徙。

3.數(shù)據(jù)訪問及集成:由 spring-jdbc醒串、spring-txspring-orm米愿、spring-jmsspring-oxm 5 個(gè)模 塊組成厦凤。

  • spring-jdbc 模塊是 Spring 提供的 JDBC 抽象框架的主要實(shí)現(xiàn)模塊冤寿,用于簡化 Spring JDBC眷蚓。主要 是提供 JDBC 模板方式、關(guān)系數(shù)據(jù)庫對象化方式窄驹、SimpleJdbc 方式违柏、事務(wù)管理來簡化 JDBC 編程博烂,主要實(shí) 現(xiàn)類是 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplate漱竖。

  • spring-tx 模塊是 Spring JDBC 事務(wù)控制實(shí)現(xiàn)模塊禽篱。使用 Spring 框架,它對事務(wù)做了很好的封裝馍惹, 通過它的 AOP 配置躺率,可以靈活的配置在任何一層;但是在很多的需求和應(yīng)用万矾,直接使用 JDBC 事務(wù)控制 還是有其優(yōu)勢的悼吱。其實(shí),事務(wù)是以業(yè)務(wù)邏輯為基礎(chǔ)的良狈;一個(gè)完整的業(yè)務(wù)應(yīng)該對應(yīng)業(yè)務(wù)層里的一個(gè)方法后添; 如果業(yè)務(wù)操作失敗,則整個(gè)事務(wù)回滾薪丁;所以遇西,事務(wù)控制是絕對應(yīng)該放在業(yè)務(wù)層的;但是严嗜,持久層的設(shè)計(jì) 則應(yīng)該遵循一個(gè)很重要的原則:保證操作的原子性粱檀,即持久層里的每個(gè)方法都應(yīng)該是不可以分割的。所 以漫玄,在使用 Spring JDBC 事務(wù)控制時(shí)茄蚯,應(yīng)該注意其特殊性。

  • spring-orm 模塊是 ORM 框架支持模塊,主要集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用于資源管理第队、數(shù)據(jù)訪問對象(DAO)的實(shí)現(xiàn)和事務(wù)策略。

  • spring-jms 模塊(Java Messaging Service)能夠發(fā)送和接受信息刨秆,自 Spring Framework 4.1 以 后凳谦,他還提供了對 spring-messaging 模塊的支撐。

  • spring-oxm 模塊主要提供一個(gè)抽象層以支撐 OXM(OXM 是 Object-to-XML-Mapping 的縮寫衡未,它是一 個(gè) O/M-mapper尸执,將 java 對象映射成 XML 數(shù)據(jù),或者將 XML 數(shù)據(jù)映射成 java 對象)缓醋,例如: JAXB, Castor, XMLBeans, JiBX 和 XStream 等如失。

4.Web:由 spring-webspring-webmvc送粱、spring-websocketspring-webmvc-portlet 4 個(gè)模塊組 成褪贵。

  • spring-web 模塊為 Spring 提供了最基礎(chǔ) Web 支持,主要建立于核心容器之上抗俄,通過 Servlet 或者 Listeners 來初始化 IoC 容器脆丁,也包含一些與 Web 相關(guān)的支持。

  • spring-webmvc 模塊眾所周知是一個(gè)的 Web-Servlet 模塊动雹,實(shí)現(xiàn)了 Spring MVC (model-view-controller)的 Web 應(yīng)用槽卫。

  • spring-websocket 模塊主要是與 Web 前端的全雙工通訊的協(xié)議。(資料缺乏胰蝠,這是個(gè)人理解)

  • spring-webmvc-portlet 模塊是知名的 Web-Portlets 模塊(Portlets 在 Web 門戶上管理和顯示的可 插拔的用戶界面組件歼培。Portlet 產(chǎn)生可以聚合到門戶頁面中的標(biāo)記語言代碼的片段,如 HTML茸塞,XML 等)躲庄, 主要是為 SpringMVC 提供 Portlets 組件支持。

5.報(bào)文發(fā)送:即 spring-messaging 模塊翔横。

  • spring-messaging 是 Spring4 新加入的一個(gè)模塊读跷,主要職責(zé)是為 Spring 框架集成一些基礎(chǔ)的報(bào)文 傳送應(yīng)用。

6.Test:即 spring-test 模塊禾唁。

  • spring-test 模塊主要為測試提供支持的效览,畢竟在不需要發(fā)布(程序)到你的應(yīng)用服務(wù)器或者連接 到其他企業(yè)設(shè)施的情況下能夠執(zhí)行一些集成測試或者其他測試對于任何企業(yè)都是非常重要的。
3.2荡短、依賴關(guān)系

該圖是 SPRING 3.2.X 的包結(jié)構(gòu)丐枉,可以從中清楚看出 Spring 各個(gè)模塊之間的依賴關(guān)系。


依賴關(guān)系圖.PNG

從圖中可以看出掘托,IOC 的實(shí)現(xiàn)包 spring-beans 和 AOP 的實(shí)現(xiàn)包 spring-aop是整個(gè)框架的基礎(chǔ)瘦锹, 而 spring-core 則是整個(gè)框架的核心,基礎(chǔ)的功能都在這三個(gè)包里。

在此基礎(chǔ)之上弯院,spring-context 提供上下文環(huán)境辱士,為各個(gè)模塊提供粘合作用。

spring-context 基礎(chǔ)之上提供了 spring-txspring-orm 包听绳,而 web 部分的功能颂碘,都是要依 賴 spring-web來實(shí)現(xiàn)的。

由于 struts 框架自身的 Bug 一直沒有修復(fù)椅挣,以及 Spring MVC 已經(jīng)足夠強(qiáng)大头岔,所以在最新的 spring 4 中已經(jīng)移除了 spring-struts 模塊。

如果你想加入 spring 源碼的學(xué)習(xí)鼠证,筆者的建議是從 spring-core 入手峡竣,其次是 spring-beansspring-aop,隨后是 spring-context量九,再其次是 spring-txspring-orm适掰,最后是 spring-web 和其他 部分。

四娩鹉、Spring 思想應(yīng)用場景(特點(diǎn))

AOP

解耦攻谁,專人做專事

1、Aspect Oriented Programming

2弯予、找出多個(gè)類中有一定規(guī)律的代碼戚宦,開發(fā)時(shí)拆開,運(yùn)行時(shí)再合并锈嫩。

3受楼、面向切面編程,即面向規(guī)則編程呼寸。

OOP

封裝艳汽、繼承、多態(tài)

1对雪、Object Oriented Programming

2河狐、歸納總結(jié)生活中一切事物。

BOP

一切從 Bean 開始

1瑟捣、Bean Oriented Programming

2馋艺、面向 Bean(普通的 java 類)設(shè)計(jì)程序。

IOC

轉(zhuǎn)交控制權(quán)

1迈套、Inversion of Control

2捐祠、將 new 對象的動(dòng)作交給 Spring 管理,并由 Spring 保存已創(chuàng)建 的對象桑李。

DI/DL

先理清關(guān)系再賦值

1踱蛀、Dependency Injection/Dependency Lookup

2窿给、依賴注入、依賴查找率拒,Spring 不僅保存自己創(chuàng)建的對象崩泡,而 且保存對象與對象之間的關(guān)系。

3猬膨、注入即賦值允华,主要三種方式構(gòu)造方法、set 方法寥掐、直接賦值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷蜀,一起剝皮案震驚了整個(gè)濱河市召耘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褐隆,老刑警劉巖污它,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庶弃,居然都是意外死亡衫贬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門歇攻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固惯,“玉大人,你說我怎么就攤上這事缴守≡岷粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵屡穗,是天一觀的道長贴捡。 經(jīng)常有香客問我,道長村砂,這世上最難降的妖魔是什么烂斋? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮础废,結(jié)果婚禮上汛骂,老公的妹妹穿的比我還像新娘。我一直安慰自己色迂,他們只是感情好香缺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歇僧,像睡著了一般图张。 火紅的嫁衣襯著肌膚如雪锋拖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天祸轮,我揣著相機(jī)與錄音兽埃,去河邊找鬼。 笑死适袜,一個(gè)胖子當(dāng)著我的面吹牛柄错,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苦酱,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼售貌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疫萤?” 一聲冷哼從身側(cè)響起颂跨,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扯饶,沒想到半個(gè)月后恒削,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尾序,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年钓丰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每币。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡携丁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兰怠,到底是詐尸還是另有隱情则北,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布痕慢,位于F島的核電站尚揣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掖举。R本人自食惡果不足惜快骗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塔次。 院中可真熱鬧方篮,春花似錦、人聲如沸励负。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽继榆。三九已至巾表,卻和暖如春汁掠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背集币。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工考阱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞠苟。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓乞榨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親当娱。 傳聞我的和親對象是個(gè)殘疾皇子吃既,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)跨细,斷路器态秧,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,464評論 1 133
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • #幸福是需要修出來的~每天進(jìn)步1%~幸福實(shí)修08班~015-董超-杭州 20170629(10/99) 【幸福三朵...
    julie123閱讀 141評論 3 2
  • 直接進(jìn)入正題 加了好友挺久了但是一直沒啥往來 上圖所示6.18突然找我.那時(shí)我在看深夜食堂扼鞋。。原因清晰明了愤诱。云头。然后...
    沒啥好看的閱讀 229評論 0 0