1.1 SSM框架

1.1.1 Spring 框架

Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成计盒。它的成功來源于理念而不是技術(shù)本身奉呛。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建蕾各、配置和管理 bean 的方式,如圖下圖所示:


spring_framework.gif

1.1.2 Spring 框架的組成

組成 Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在庆揪,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)式曲。每個(gè)模塊的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory缸榛,它是工廠模式的實(shí)現(xiàn)吝羞。BeanFactory 使用控制反轉(zhuǎn) (IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
  • Spring 上下文:Spring 上下文是一個(gè)配置文件内颗,向 Spring 框架提供上下文信息钧排。-
    Spring 上下文包括企業(yè)服務(wù),例如 JNDI均澳、EJB恨溜、電子郵件、國際化找前、校驗(yàn)和調(diào)度功能糟袁。
  • Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中躺盛。所以系吭,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)颗品。通過使用 Spring AOP,不用依賴 EJB 組件沃缘,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中躯枢。
  • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息槐臀。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理锄蹂,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)水慨。
  • Spring ORM:Spring 框架插入了若干個(gè) ORM 框架得糜,從而提供了 ORM 的對(duì)象關(guān)系工具敬扛,其中包括 JDO、Hibernate 和 iBatis SQL Map朝抖。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)啥箭。
  • Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文治宣。所以急侥,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/li>
  • Spring MVC 框架:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)侮邀。通過策略接口坏怪,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù)绊茧,其中包括 JSP铝宵、Velocity、Tiles华畏、iText 和 POI鹏秋。

1.1.3 Spring IoC

IoC是什么?

Ioc—Inversion of Control,即“控制反轉(zhuǎn)”唯绍,不是什么技術(shù)拼岳,而是一種設(shè)計(jì)思想。在Java開發(fā)中况芒,Ioc意味著將你設(shè)計(jì)好的對(duì)象交給容器控制惜纸,而不是傳統(tǒng)的在你的對(duì)象內(nèi)部直接控制。如何理解好Ioc呢绝骚?理解好Ioc的關(guān)鍵是要明確“誰控制誰耐版,控制什么,為何是反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了)压汪,哪些方面反轉(zhuǎn)了”粪牲,那我們來深入分析一下:
  ●誰控制誰,控制什么:傳統(tǒng)Java SE程序設(shè)計(jì)止剖,我們直接在對(duì)象內(nèi)部通過new進(jìn)行創(chuàng)建對(duì)象腺阳,是程序主動(dòng)去創(chuàng)建依賴對(duì)象;而IoC是有專門一個(gè)容器來創(chuàng)建這些對(duì)象穿香,即由Ioc容器來控制對(duì) 象的創(chuàng)建亭引;誰控制誰?當(dāng)然是IoC 容器控制了對(duì)象皮获;控制什么焙蚓?那就是主要控制了外部資源獲取(不只是對(duì)象包括比如文件等)。
  ●為何是反轉(zhuǎn)购公,哪些方面反轉(zhuǎn)了:有反轉(zhuǎn)就有正轉(zhuǎn)萌京,傳統(tǒng)應(yīng)用程序是由我們自己在對(duì)象中主動(dòng)控制去直接獲取依賴對(duì)象,也就是正轉(zhuǎn)宏浩;而反轉(zhuǎn)則是由容器來幫忙創(chuàng)建及注入依賴對(duì)象知残;為何是反轉(zhuǎn)?因?yàn)橛扇萜鲙臀覀儾檎壹白⑷胍蕾噷?duì)象绘闷,對(duì)象只是被動(dòng)的接受依賴對(duì)象橡庞,所以是反轉(zhuǎn);哪些方面反轉(zhuǎn)了印蔗?依賴對(duì)象的獲取被反轉(zhuǎn)了扒最。
  用圖例說明一下,傳統(tǒng)程序設(shè)計(jì)如下圖华嘹,都是主動(dòng)去創(chuàng)建相關(guān)對(duì)象然后再組合起來:


  當(dāng)有了IoC/DI的容器后吧趣,在客戶端類中不再主動(dòng)去創(chuàng)建這些對(duì)象了,如下圖所示:

IoC能做什么

  • IoC 不是一種技術(shù)耙厚,只是一種思想强挫,一個(gè)重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計(jì)出松耦合薛躬、更優(yōu)良的程序俯渤。傳統(tǒng)應(yīng)用程序都是由我們?cè)陬悆?nèi)部主動(dòng)創(chuàng)建依賴對(duì)象,從而導(dǎo)致類與類之間高耦合型宝,難于測(cè)試八匠;有了IoC容器后,把創(chuàng)建和查找依賴對(duì)象的控制權(quán)交給了容器趴酣,由容器進(jìn)行注入組合對(duì)象梨树,所以對(duì)象與對(duì)象之間是 松散耦合,這樣也方便測(cè)試岖寞,利于功能復(fù)用抡四,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。

  • 其實(shí)IoC對(duì)編程帶來的最大改變不是從代碼上仗谆,而是從思想上指巡,發(fā)生了“主從換位”的變化。應(yīng)用程序原本是老大隶垮,要獲取什么資源都是主動(dòng)出擊厌处,但是在IoC/DI思想中,應(yīng)用程序就變成被動(dòng)的了岁疼,被動(dòng)的等待IoC容器來創(chuàng)建并注入它所需要的資源了钓丰。

  • IoC很好的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)法則之一—— 好萊塢法則:“別找我們,我們找你”粪躬;即由IoC容器幫對(duì)象找相應(yīng)的依賴對(duì)象并注入捉貌,而不是由對(duì)象主動(dòng)去找。

IoC和DI

  • DI—Dependency Injection暖侨,即“依賴注入”:組件之間依賴關(guān)系由容器在運(yùn)行期決定椭住,形象的說,即由容器動(dòng)態(tài)的將某個(gè)依賴關(guān)系注入到組件之中字逗。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能京郑,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活葫掉、可擴(kuò)展的平臺(tái)些举。通過依賴注入機(jī)制,我們只需要通過簡(jiǎn)單的配置俭厚,而無需任何代碼就可指定目標(biāo)需要的資源户魏,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來自何處挪挤,由誰實(shí)現(xiàn)叼丑。

  • 理解DI的關(guān)鍵是:“誰依賴誰,為什么需要依賴扛门,誰注入誰鸠信,注入了什么”,那我們來深入分析一下:
    ●誰依賴于誰:當(dāng)然是應(yīng)用程序依賴于IoC容器论寨;
    ●為什么需要依賴:應(yīng)用程序需要IoC容器來提供對(duì)象需要的外部資源星立;
    ●誰注入誰:很明顯是IoC容器注入應(yīng)用程序某個(gè)對(duì)象,應(yīng)用程序依賴的對(duì)象政基;
    ●注入了什么:就是注入某個(gè)對(duì)象所需要的外部資源(包括對(duì)象贞铣、資源、常量數(shù)據(jù))沮明。

  • IoC和DI由什么關(guān)系呢辕坝?其實(shí)它們是同一個(gè)概念的不同角度描述,由于控制反轉(zhuǎn)概念比較含糊(可能只是理解為容器控制對(duì)象這一個(gè)層面荐健,很難讓人想到誰來維護(hù)對(duì)象關(guān)系)酱畅,所以2004年大師級(jí)人物Martin Fowler又給出了一個(gè)新的名字:“依賴注入”,相對(duì)IoC 而言江场,“依賴注入”明確描述了“被注入對(duì)象依賴IoC容器配置依賴對(duì)象”纺酸。

    ● 看過很多對(duì)Spring的Ioc理解的文章,好多人對(duì)Ioc和DI的解釋都晦澀難懂址否,反正就是一種說不清餐蔬,道不明的感覺碎紊,讀完之后依然是一頭霧水,感覺就是開濤這位技術(shù)牛人寫得特別通俗易懂樊诺,他清楚地解釋了IoC(控制反轉(zhuǎn)) 和DI(依賴注入)中的每一個(gè)字仗考,讀完之后給人一種豁然開朗的感覺。我相信對(duì)于初學(xué)Spring框架的人對(duì)Ioc的理解應(yīng)該是有很大幫助的词爬。

IoC(控制反轉(zhuǎn))

  • 首先想說說IoC(Inversion of Control秃嗜,控制反轉(zhuǎn))。這是spring的核心顿膨,貫穿始終锅锨。所謂IoC,對(duì)于spring框架來說恋沃,就是由spring來負(fù)責(zé)控制對(duì)象的生命周期和對(duì)象間的關(guān)系必搞。這是什么意思呢,舉個(gè)簡(jiǎn)單的例子芽唇,我們是如何找女朋友的顾画?常見的情況是,我們到處去看哪里有長(zhǎng)得漂亮身材又好的mm匆笤,然后打聽她們的興趣愛好研侣、qq號(hào)、電話號(hào)炮捧、ip號(hào)庶诡、iq號(hào)………,想辦法認(rèn)識(shí)她們咆课,投其所好送其所要末誓,然后嘿嘿……這個(gè)過程是復(fù)雜深?yuàn)W的,我們必須自己設(shè)計(jì)和面對(duì)每個(gè)環(huán)節(jié)书蚪。傳統(tǒng)的程序開發(fā)也是如此喇澡,在一個(gè)對(duì)象中,如果要使用另外的對(duì)象殊校,就必須得到它(自己new一個(gè)晴玖,或者從JNDI中查詢一個(gè)),使用完之后還要將對(duì)象銷毀(比如Connection等)为流,對(duì)象始終會(huì)和其他的接口或類藕合起來呕屎。
  • 那么IoC是如何做的呢?有點(diǎn)像通過婚介找女朋友敬察,在我和女朋友之間引入了一個(gè)第三者:婚姻介紹所秀睛。婚介管理了很多男男女女的資料莲祸,我可以向婚介提出一個(gè)列表蹂安,告訴它我想找個(gè)什么樣的女朋友椭迎,比如長(zhǎng)得像李嘉欣,身材像林熙雷田盈,唱歌像周杰倫侠碧,速度像卡洛斯,技術(shù)像齊達(dá)內(nèi)之類的缠黍,然后婚介就會(huì)按照我們的要求,提供一個(gè)mm药蜻,我們只需要去和她談戀愛瓷式、結(jié)婚就行了。簡(jiǎn)單明了语泽,如果婚介給我們的人選不符合要求贸典,我們就會(huì)拋出異常。整個(gè)過程不再由我自己控制踱卵,而是有婚介這樣一個(gè)類似容器的機(jī)構(gòu)來控制廊驼。Spring所倡導(dǎo)的開發(fā)方式就是如此,所有的類都會(huì)在spring容器中登記惋砂,告訴spring你是個(gè)什么東西妒挎,你需要什么東西,然后spring會(huì)在系統(tǒng)運(yùn)行到適當(dāng)?shù)臅r(shí)候西饵,把你要的東西主動(dòng)給你酝掩,同時(shí)也把你交給其他需要你的東西。所有的類的創(chuàng)建眷柔、銷毀都由 spring來控制期虾,也就是說控制對(duì)象生存周期的不再是引用它的對(duì)象,而是spring驯嘱。對(duì)于某個(gè)具體的對(duì)象而言镶苞,以前是它控制其他對(duì)象,現(xiàn)在是所有對(duì)象都被spring控制鞠评,所以這叫控制反轉(zhuǎn)茂蚓。

DI(依賴注入)

  • IoC的一個(gè)重點(diǎn)是在系統(tǒng)運(yùn)行中,動(dòng)態(tài)的向某個(gè)對(duì)象提供它所需要的其他對(duì)象谢澈。這一點(diǎn)是通過DI(Dependency Injection煌贴,依賴注入)來實(shí)現(xiàn)的。比如對(duì)象A需要操作數(shù)據(jù)庫锥忿,以前我們總是要在A中自己編寫代碼來獲得一個(gè)Connection對(duì)象牛郑,有了 spring我們就只需要告訴spring,A中需要一個(gè)Connection敬鬓,至于這個(gè)Connection怎么構(gòu)造淹朋,何時(shí)構(gòu)造笙各,A不需要知道。在系統(tǒng)運(yùn)行時(shí)础芍,spring會(huì)在適當(dāng)?shù)臅r(shí)候制造一個(gè)Connection杈抢,然后像打針一樣,注射到A當(dāng)中仑性,這樣就完成了對(duì)各個(gè)對(duì)象之間關(guān)系的控制惶楼。A需要依賴 Connection才能正常運(yùn)行,而這個(gè)Connection是由spring注入到A中的诊杆,依賴注入的名字就這么來的歼捐。那么DI是如何實(shí)現(xiàn)的呢? Java 1.3之后一個(gè)重要特征是反射(reflection)晨汹,它允許程序在運(yùn)行的時(shí)候動(dòng)態(tài)的生成對(duì)象豹储、執(zhí)行對(duì)象的方法、改變對(duì)象的屬性淘这,spring就是通過反射來實(shí)現(xiàn)注入的剥扣。
  • 理解了IoC和DI的概念后,一切都將變得簡(jiǎn)單明了铝穷,剩下的工作只是在spring的框架中堆積木而已钠怯。
    • 在平時(shí)的java應(yīng)用開發(fā)中,我們要實(shí)現(xiàn)某一個(gè)功能或者說是完成某個(gè)業(yè)務(wù)邏輯時(shí)至少需要兩個(gè)或以上的對(duì)象來協(xié)作完成氧骤,在沒有使用Spring的時(shí)候呻疹,每個(gè)對(duì)象在需要使用他的合作對(duì)象時(shí),自己均要使用像new object() 這樣的語法來將合作對(duì)象創(chuàng)建出來筹陵,這個(gè)合作對(duì)象是由自己主動(dòng)創(chuàng)建出來的刽锤,創(chuàng)建合作對(duì)象的主動(dòng)權(quán)在自己手上,自己需要哪個(gè)合作對(duì)象朦佩,就主動(dòng)去創(chuàng)建并思,創(chuàng)建合作對(duì)象的主動(dòng)權(quán)和創(chuàng)建時(shí)機(jī)是由自己把控的,而這樣就會(huì)使得對(duì)象間的耦合度高了语稠,A對(duì)象需要使用合作對(duì)象B來共同完成一件事宋彼,A要使用B,那么A就對(duì)B產(chǎn)生了依賴仙畦,也就是A和B之間存在一種耦合關(guān)系输涕,并且是緊密耦合在一起,而使用了Spring之后就不一樣了慨畸,創(chuàng)建合作對(duì)象B的工作是由Spring來做的莱坎,Spring創(chuàng)建好B對(duì)象,然后存儲(chǔ)到一個(gè)容器里面寸士,當(dāng)A對(duì)象需要使用B對(duì)象時(shí)檐什,Spring就從存放對(duì)象的那個(gè)容器里面取出A要使用的那個(gè)B對(duì)象碴卧,然后交給A對(duì)象使用,至于Spring是如何創(chuàng)建那個(gè)對(duì)象乃正,以及什么時(shí)候創(chuàng)建好對(duì)象的住册,A對(duì)象不需要關(guān)心這些細(xì)節(jié)問題(你是什么時(shí)候生的,怎么生出來的我可不關(guān)心瓮具,能幫我干活就行)荧飞,A得到Spring給我們的對(duì)象之后,兩個(gè)人一起協(xié)作完成要完成的工作即可名党。
    • 所以控制反轉(zhuǎn)IoC(Inversion of Control)是說創(chuàng)建對(duì)象的控制權(quán)進(jìn)行轉(zhuǎn)移垢箕,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和創(chuàng)建時(shí)機(jī)是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到第三方兑巾,比如轉(zhuǎn)移交給了IoC容器,它就是一個(gè)專門用來創(chuàng)建對(duì)象的工廠忠荞,你要什么對(duì)象蒋歌,它就給你什么對(duì)象,有了 IoC容器委煤,依賴關(guān)系就變了堂油,原先的依賴關(guān)系就沒了,它們都依賴IoC容器了碧绞,通過IoC容器來建立它們之間的關(guān)系府框。
    • 這是我對(duì)Spring的IoC(控制反轉(zhuǎn))的理解。DI(依賴注入)其實(shí)就是IOC的另外一種說法讥邻,DI是由Martin Fowler 在2004年初的一篇論文中首次提出的迫靖。他總結(jié):控制的什么被反轉(zhuǎn)了?就是:獲得依賴對(duì)象的方式反轉(zhuǎn)了兴使。

1.1.4 Spring AOP

IoC 的目標(biāo)是為了管理Bean系宜。而Bean是Java面向?qū)ο螅∣OP)的基礎(chǔ)設(shè)計(jì)。

  • 面向切面編程(AOP)通過提供另外一種思考程序結(jié)構(gòu)的途經(jīng)來彌補(bǔ)面向?qū)ο缶幊蹋∣OP)的不足发魄。在OOP中模塊化的關(guān)鍵單元是類(classes)盹牧,而在AOP中模塊化的單元?jiǎng)t是切面。切面能對(duì)關(guān)注點(diǎn)進(jìn)行模塊化励幼,例如橫切多個(gè)類型和對(duì)象的事務(wù)管理汰寓。(在AOP術(shù)語中通常稱作橫切(crosscutting)關(guān)注點(diǎn)。)
  • AOP框架是Spring的一個(gè)重要組成部分苹粟。但是Spring IoC容器并不依賴于AOP有滑,這意味著你有權(quán)利選擇是否使用AOP,AOP做為Spring IoC容器的一個(gè)補(bǔ)充,使它成為一個(gè)強(qiáng)大的中間件解決方案六水。
  • AOP在Spring Framework中的作用
    • 提供聲明式企業(yè)服務(wù)俺孙,特別是為了替代EJB聲明式服務(wù)辣卒。最重要的服務(wù)是聲明性事務(wù)管理。
    • 允許用戶實(shí)現(xiàn)自定義切面睛榄,用AOP來完善OOP的使用荣茫。

如果你只打算使用通用的聲明式服務(wù)或者封裝好的聲明式中間件服務(wù),例如緩沖池(pooling)场靴,那么你不必與Spring AOP直接打交道啡莉,并且本章的大部分內(nèi)容可以跳過了。

AOP概念

首先讓我們從一些重要的AOP概念和術(shù)語開始旨剥。這些術(shù)語不是Spring特有的咧欣。不過AOP術(shù)語并不是特別的直觀,如果Spring使用自己的術(shù)語轨帜,將會(huì)變得更加令人困惑魄咕。
切面(Aspect)*:一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象蚌父。事務(wù)管理是J2EE應(yīng)用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子哮兰。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式來實(shí)現(xiàn)苟弛。

連接點(diǎn)(Joinpoint):在程序執(zhí)行過程中某個(gè)特定的點(diǎn)喝滞,比如某方法調(diào)用的時(shí)候或者處理異常的時(shí)候。在Spring AOP中膏秫,一個(gè)連接點(diǎn)總是表示一個(gè)方法的執(zhí)行右遭。

通知(Advice):在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。其中包括了“around”缤削、“before”和“after”等不同類型的通知(通知的類型將在后面部分進(jìn)行討論)窘哈。許多AOP框架(包括Spring)都是以攔截器做通知模型,并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈亭敢。

切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言宵距。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián),并在滿足這個(gè)切入點(diǎn)的連接點(diǎn)上運(yùn)行(例如吨拗,當(dāng)執(zhí)行某個(gè)特定名稱的方法時(shí))满哪。切入點(diǎn)表達(dá)式如何和連接點(diǎn)匹配是AOP的核心:Spring缺省使用AspectJ切入點(diǎn)語法。

引入(Introduction):用來給一個(gè)類型聲明額外的方法或?qū)傩裕ㄒ脖环Q為連接類型聲明(inter-type declaration))劝篷。Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象哨鸭。例如,你可以使用引入來使一個(gè)bean實(shí)現(xiàn)IsModified
接口娇妓,以便簡(jiǎn)化緩存機(jī)制像鸡。

目標(biāo)對(duì)象(Target Object): 被一個(gè)或者多個(gè)切面所通知的對(duì)象。也被稱做被通知(advised)對(duì)象。 既然Spring AOP是通過運(yùn)行時(shí)代理實(shí)現(xiàn)的只估,這個(gè)對(duì)象永遠(yuǎn)是一個(gè)被代理(proxied)對(duì)象志群。

AOP代理(AOP Proxy):AOP框架創(chuàng)建的對(duì)象,用來實(shí)現(xiàn)切面契約(例如通知方法執(zhí)行等等)蛔钙。在Spring中锌云,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。

織入(Weaving):把切面連接到其它的應(yīng)用程序類型或者對(duì)象上吁脱,并創(chuàng)建一個(gè)被通知的對(duì)象桑涎。這些可以在編譯時(shí)(例如使用AspectJ編譯器),類加載時(shí)和運(yùn)行時(shí)完成兼贡。Spring和其他純Java AOP框架一樣攻冷,在運(yùn)行時(shí)完成織入。

通知類型:
前置通知(Before advice):在某連接點(diǎn)之前執(zhí)行的通知遍希,但這個(gè)通知不能阻止連接點(diǎn)之前的執(zhí)行流程(除非它拋出一個(gè)異常)等曼。

后置通知(After returning advice):在某連接點(diǎn)正常完成后執(zhí)行的通知:例如,一個(gè)方法沒有拋出任何異常凿蒜,正常返回涉兽。

異常通知(After throwing advice):在方法拋出異常退出時(shí)執(zhí)行的通知。

最終通知(After (finally) advice):當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)篙程。

環(huán)繞通知(Around Advice):包圍一個(gè)連接點(diǎn)的通知,如方法調(diào)用别厘。這是最強(qiáng)大的一種通知類型虱饿。環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它自己的返回值或拋出異常來結(jié)束執(zhí)行触趴。

  • 環(huán)繞通知是最常用的通知類型氮发。和AspectJ一樣,Spring提供所有類型的通知冗懦,我們推薦你使用盡可能簡(jiǎn)單的通知類型來實(shí)現(xiàn)需要的功能爽冕。例如,如果你只是需要一個(gè)方法的返回值來更新緩存披蕉,最好使用后置通知而不是環(huán)繞通知颈畸,盡管環(huán)繞通知也能完成同樣的事情。用最合適的通知類型可以使得編程模型變得簡(jiǎn)單没讲,并且能夠避免很多潛在的錯(cuò)誤眯娱。比如,你不需要在JoinPoint上調(diào)用用于環(huán)繞通知的proceed()方法爬凑,就不會(huì)有調(diào)用的問題徙缴。
  • 在Spring 2.0中,所有的通知參數(shù)都是靜態(tài)類型嘁信,因此你可以使用合適的類型(例如一個(gè)方法執(zhí)行后的返回值類型)作為通知的參數(shù)而不是使用Object
    數(shù)組于样。
  • 通過切入點(diǎn)匹配連接點(diǎn)的概念是AOP的關(guān)鍵疏叨,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)。 切入點(diǎn)使得通知可以獨(dú)立對(duì)應(yīng)到面向?qū)ο蟮膶哟谓Y(jié)構(gòu)中穿剖。例如蚤蔓,一個(gè)提供聲明式事務(wù)管理 的環(huán)繞通知可以被應(yīng)用到一組橫跨多個(gè)對(duì)象的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)。

更多用法與詳解參考這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末携御,一起剝皮案震驚了整個(gè)濱河市昌粤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啄刹,老刑警劉巖涮坐,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誓军,居然都是意外死亡袱讹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門昵时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捷雕,“玉大人,你說我怎么就攤上這事壹甥【认铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵句柠,是天一觀的道長(zhǎng)浦译。 經(jīng)常有香客問我,道長(zhǎng)溯职,這世上最難降的妖魔是什么精盅? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谜酒,結(jié)果婚禮上叹俏,老公的妹妹穿的比我還像新娘。我一直安慰自己僻族,他們只是感情好粘驰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著述么,像睡著了一般晴氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碉输,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天籽前,我揣著相機(jī)與錄音,去河邊找鬼。 笑死枝哄,一個(gè)胖子當(dāng)著我的面吹牛肄梨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挠锥,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼众羡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蓖租?” 一聲冷哼從身側(cè)響起粱侣,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓖宦,沒想到半個(gè)月后齐婴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠茂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柠偶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬关。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诱担,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出电爹,到底是詐尸還是另有隱情蔫仙,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布丐箩,位于F島的核電站摇邦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雏蛮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一阱州、第九天 我趴在偏房一處隱蔽的房頂上張望挑秉。 院中可真熱鬧,春花似錦苔货、人聲如沸犀概。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姻灶。三九已至,卻和暖如春诈茧,著一層夾襖步出監(jiān)牢的瞬間产喉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曾沈,地道東北人这嚣。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像塞俱,于是被迫代替她去往敵國和親姐帚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理障涯,服務(wù)發(fā)現(xiàn)罐旗,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架唯蝶。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,464評(píng)論 1 133
  • 1生棍、Spring是什么 簡(jiǎn)單來說颤霎,Spring就是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。從...
    拾壹北閱讀 960評(píng)論 0 10
  • 從三月份找實(shí)習(xí)到現(xiàn)在涂滴,面了一些公司友酱,掛了不少,但最終還是拿到小米柔纵、百度缔杉、阿里、京東搁料、新浪或详、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,253評(píng)論 11 349
  • 長(zhǎng)路修遠(yuǎn)風(fēng)兼雨郭计, 求索道上幾崎嶇霸琴。 欲織好夢(mèng)成錦繡, 夜半驚醒露寒時(shí)昭伸。
    舟不系閱讀 157評(píng)論 0 0