一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

深入理解Spring的兩大特征(IOC和AOP)

 hlhq1 2019-12-20

一、spring 的優(yōu)點?

1.降低了組件之間的耦合性 ,實現(xiàn)了軟件各層之間的解耦

2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等

3.容器提供單例模式支持

4.容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限攔截,運行期監(jiān)控等功能

5.容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā)

6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等

7.spring屬于低侵入式設(shè)計,代碼的污染極低

8.獨立于各種應(yīng)用服務(wù)器

9.spring的DI機制降低了業(yè)務(wù)對象替換的復雜性

10.Spring的高度開放性,并不強制應(yīng)用完全依賴于Spring,開發(fā)者可以自由選擇spring的部分或全部

二、什么是IOC(DI)?

深入理解Spring的兩大特征(IOC和AOP)

IOC,即控制反轉(zhuǎn)(Inversion of Control),他與依賴注入(Dependecy Injection)是同一個概念。具體的講:當某個角色需要另外一個角色協(xié)助的時候,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例。但在spring中 創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成,然后注入調(diào)用者因此也稱為依賴注入。

它并不是一種技術(shù)實現(xiàn),而是一種設(shè)計思想。在任何一個有實際開發(fā)意義的程序項目中,我們會使用很多類來描述它們特有的功能,并且通過類與類之間的相互協(xié)作來完成特定的業(yè)務(wù)邏輯。這個時候,每個類都需要負責管理與自己有交互的類的引用和依賴,代碼將會變的異常難以維護和極度的高耦合。而IOC的出現(xiàn)正是用來解決這個問題,我們通過IOC將這些相互依賴對象的創(chuàng)建、協(xié)調(diào)工作交給Spring容器去處理,每個對象只需要關(guān)注其自身的業(yè)務(wù)邏輯關(guān)系就可以了。在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉(zhuǎn),變成了由spring容器控制對象如何獲取外部資源(包括其他對象和文件資料等等)。

舉例:某一天,你生病了,但是你不清楚自己到底得了什么病,你只知道自己頭疼,咳嗽,全身無力。這個時候你決定去藥店買藥,藥店有很多種藥,僅僅是治療頭疼就有好幾十種,還有西藥中藥等區(qū)別。然后你自己看了看說明書,選擇了一盒你自己覺得最能治療自己病癥的藥,付錢吃藥,期待可以早點好起來。 但是這個過程,對于一個病人來說,太辛苦了。頭疼,咳嗽,全身無力,還要一個個的看藥品說明書,一個個的比較哪個藥比較好,簡直是太累了。這個時候,你決定直接去醫(yī)院看醫(yī)生。 醫(yī)生給你做了檢查,知道你的病癥是什么,有什么原因引起的;同時醫(yī)生非常了解有哪些藥能治療你的病痛,并且能根據(jù)你的自身情況進行篩選。只需要短短的十幾分鐘,你就能拿到對癥下藥的藥品,即省時又省力。

在上面這個例子中,IOC起到的就是醫(yī)生的作用,它收集你的需求要求,并且對癥下藥,直接把藥開給你。你就是對象,藥品就是你所需要的外部資源。通過醫(yī)生,你不用再去找藥品,而是通過醫(yī)生把藥品開給你。這就是整個IOC的精髓所在。

Spring以動態(tài)靈活的方式來管理對象 , 注入的兩種方式,設(shè)置注入和構(gòu)造注入。

設(shè)置注入的優(yōu)點:直觀,自然

構(gòu)造注入的優(yōu)點:可以在構(gòu)造器中決定依賴關(guān)系的順序。

三、什么是AOP?

深入理解Spring的兩大特征(IOC和AOP)

AOP:面向切面編程,往往被定義為促使軟件系統(tǒng)實現(xiàn)關(guān)注點的分離的技術(shù)。系統(tǒng)是由許多不同的組件所組成的,每一個組件各負責一塊特定功能。除了實現(xiàn)自身核心功能之外,這些組件還經(jīng)常承擔著額外的職責。例如日志、事務(wù)管理和安全這樣的核心服務(wù)經(jīng)常融入到自身具有核心業(yè)務(wù)邏輯的組件中去。這些系統(tǒng)服務(wù)經(jīng)常被稱為橫切關(guān)注點,因為它們會跨越系統(tǒng)的多個組件。

AOP的概念不像IOC一樣實例化舉例,現(xiàn)在我們以一個系統(tǒng)中的具體實現(xiàn)來講講AOP具體是個什么技術(shù)。

我們以系統(tǒng)中常用到的事務(wù)管控舉例子。在系統(tǒng)操作數(shù)據(jù)庫的過程中,不可避免地要考慮到事務(wù)相關(guān)的內(nèi)容。如果在每一個方法中都新建一個事務(wù)管理器,那么無疑是對代碼嚴重的耦合和侵入。為了簡化我們的開發(fā)過程(實際上spring所做的一切實現(xiàn)都是為了簡化開發(fā)過程),需要把事務(wù)相關(guān)的代碼抽成出來做為一個獨立的模塊。通過AOP,確認每一個操作數(shù)據(jù)庫方法為一個連接點,這些連接點組成了一個切面。當程序運行到其中某個一個切點時,我們將事務(wù)管理模塊順勢織入對象中,通過通知功能,完成整個事務(wù)管控的實現(xiàn)。這樣一來,所有的操作數(shù)據(jù)庫的方法中不需要再單獨關(guān)心事務(wù)管理的內(nèi)容,只需要關(guān)注自身的業(yè)務(wù)代碼的實現(xiàn)即可。所有的事務(wù)管控相關(guān)的內(nèi)容都通過AOP的方式進行了實現(xiàn)。簡化了代碼的內(nèi)容,將目標對象復雜的內(nèi)容進行解耦,分離業(yè)務(wù)邏輯與橫切關(guān)注點。

下面介紹一下AOP相關(guān)的術(shù)語:

1、通知: 通知定義了切面是什么以及何時使用的概念。Spring 切面可以應(yīng)用5種類型的通知:

  • 前置通知(Before):在目標方法被調(diào)用之前調(diào)用通知功能。
  • 后置通知(After):在目標方法完成之后調(diào)用通知,此時不會關(guān)心方法的輸出是什么。
  • 返回通知(After-returning):在目標方法成功執(zhí)行之后調(diào)用通知。
  • 異常通知(After-throwing):在目標方法拋出異常后調(diào)用通知。
  • 環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為。

2、連接點:是在應(yīng)用執(zhí)行過程中能夠插入切面的一個點。

3、切點: 切點定義了切面在何處要織入的一個或者多個連接點。

4、切面:是通知和切點的結(jié)合。通知和切點共同定義了切面的全部內(nèi)容。

5、引入:引入允許我們向現(xiàn)有類添加新方法或?qū)傩浴?/p>

6、織入:是把切面應(yīng)用到目標對象,并創(chuàng)建新的代理對象的過程。切面在指定的連接點被織入到目標對象中。在目標對象的生命周期中有多個點可以進行織入:

  • 編譯期: 在目標類編譯時,切面被織入。這種方式需要特殊的編譯器。AspectJ的織入編譯器就是以這種方式織入切面的。
  • 類加載期:切面在目標加載到JVM時被織入。這種方式需要特殊的類加載器(class loader)它可以在目標類被引入應(yīng)用之前增強該目標類的字節(jié)碼。
  • 運行期: 切面在應(yīng)用運行到某個時刻時被織入。一般情況下,在織入切面時,AOP容器會為目標對象動態(tài)地創(chuàng)建一個代理對象。SpringAOP就是以這種方式織入切面的。

面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現(xiàn)為兩個方面:

  1. 面向切面編程提供聲明式事務(wù)管理
  2. spring支持用戶自定義的切面

面向切面編程(aop)是對面向?qū)ο缶幊蹋╫op)的補充, 面向?qū)ο缶幊虒⒊绦蚍纸獬筛鱾€層次的對象,面向切面編程將程序運行過程分解成各個切面。

AOP從程序運行角度考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過程的切面,oop是靜態(tài)的抽象,aop是動態(tài)的抽象, 是對應(yīng)用執(zhí)行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。

AOP框架具有的兩個特征:

  1. 各個步驟之間的良好隔離性
  2. 源代碼無關(guān)性

四、總結(jié):

IOC:控制反轉(zhuǎn)也叫依賴注入,IOC利用java反射機制,AOP利用代理模式。所謂控制反轉(zhuǎn)是指,本來被調(diào)用者的實例是有調(diào)用者來創(chuàng)建的,這樣的缺點是耦合性太強,IOC則是統(tǒng)一交給spring來管理創(chuàng)建,將對象交給容器管理,你只需要在spring配置文件總配置相應(yīng)的bean,以及設(shè)置相關(guān)的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啟動的時候,spring會把你在配置文件中配置的bean都初始化好,然后在你需要調(diào)用的時候,就把它已經(jīng)初始化好的那些bean分配給你需要調(diào)用這些bean的類。

AOP:面向切面編程。(Aspect-Oriented Programming)

AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態(tài)性等概念來建立一種對象層次結(jié)構(gòu),用以模擬公共行為的一個集合。實現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼,屬于靜態(tài)代理。

如果還不明白,放棄java吧!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲少妇一区二区三区懂色| 欧美熟妇喷浆一区二区| 久久精品蜜桃一区二区av| 加勒比东京热拍拍一区二区| 青青操视频在线播放免费| 成人精品网一区二区三区| 欧美日韩亚洲国产精品| 免费观看在线午夜视频| 日本高清视频在线播放| 久久国产人妻一区二区免费| 亚洲国产香蕉视频在线观看| 亚洲综合日韩精品欧美综合区 | 亚洲中文字幕视频在线播放| 激情视频在线视频在线视频| 国产高清精品福利私拍| 日韩一区二区三区在线日| 亚洲精品深夜福利视频| 亚洲深夜精品福利一区| 国产成人人人97超碰熟女| 老熟妇2久久国内精品| 在线观看视频成人午夜| 亚洲国产日韩欧美三级| 亚洲日本加勒比在线播放| 日韩亚洲精品国产第二页| 亚洲人午夜精品射精日韩 | 婷婷一区二区三区四区| 国产av精品一区二区| 东京热加勒比一区二区三区 | 日本婷婷色大香蕉视频在线观看 | 亚洲国产精品国自产拍社区| 国产精品日韩欧美第一页| 麻豆tv传媒在线观看| 欧美三级不卡在线观线看 | 亚洲国产精品久久网午夜| 亚洲一区在线观看蜜桃| 日韩中文字幕欧美亚洲| 亚洲欧美日本国产有色| 在线免费观看黄色美女| 欧美日韩人妻中文一区二区| 91亚洲国产成人久久精品麻豆| 国产一区欧美午夜福利|