日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Spring的IoC与AOP的理解

發(fā)布時(shí)間:2025/3/18 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的IoC与AOP的理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Spring它到底是什么?

Spring是一個(gè)開源的Java應(yīng)用程序開發(fā)框架,為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。

??在spring中,它會認(rèn)為一切Java類都是資源,而資源就是Bean,容納這些Bean是Spring所提供的IoC(Inversion of Control)容器。Spring框架除了幫我們管理對象及其依賴關(guān)系(IoC),還提供像通用日志記錄、性能統(tǒng)計(jì)、安全控制、異常處理等面向切面的能力(AOP),還能幫我管理最頭疼的數(shù)據(jù)庫事務(wù),提供與第三方數(shù)據(jù)訪問框架集成(如Hibernate、JPA),與各種Java EE技術(shù)整合(如Java Mail、任務(wù)調(diào)度等等),提供一套自己的web層框架Spring MVC、而且還能非常簡單的與第三方web框架集成。

2.IoC它是一種思想


??IoC—Inversion of Control,即“控制反轉(zhuǎn)”,是一種設(shè)計(jì)思想。這樣的思想是源自于生活的,其核心就是資源不由使用資源的雙方管理,而由不使用資源的第三方管理。例如,我們每天使用的支付寶、微信支付等支付體系就可以說是一個(gè)龐大的IoC容器。
??DI(依賴注入)其實(shí)就是對IoC設(shè)計(jì)思想的具體實(shí)現(xiàn)。IoC主要的實(shí)現(xiàn)方式有兩種:依賴查找,依賴注入。依賴注入是一種更可取的方式。

??回到Java中,IoC意味著將開發(fā)者編寫的Java對象交給IoC容器控制,要理解IoC,就要抓住關(guān)鍵詞"Control"。

作為開發(fā)者我們控制什么?

  • 傳統(tǒng)設(shè)計(jì),我們需要訪問對象的成員或使用對象中的方法時(shí),我們需要在程序中通過new進(jìn)行創(chuàng)建對象,是程序主動(dòng)的去創(chuàng)建依賴對象。

IoC控制了什么?

  • IoC是有專門一個(gè)容器來創(chuàng)建這些對象,即由Ioc容器來控制對象的創(chuàng)建;是IoC 容器控制了對象即被動(dòng)創(chuàng)建了對象;控制什么?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。

??反轉(zhuǎn)就好理解了,傳統(tǒng)應(yīng)用程序是由我們自己在對象中主動(dòng)控制去直接獲取依賴對象,就是正轉(zhuǎn);而反轉(zhuǎn)則是由容器來幫忙創(chuàng)建及注入依賴對象。對象的控制權(quán)反轉(zhuǎn)了。這就是一種控制反轉(zhuǎn)的理念,它最大的好處在于降低對象之間的耦合。
IoC實(shí)際上是軟件設(shè)計(jì)中依賴倒置原則的體現(xiàn),有興趣可以參考這篇文章。

3.面向切片編程AOP


??AOP其實(shí)就是一種解耦的思想,并不神秘,其目的就是將項(xiàng)目業(yè)務(wù)邏輯代碼與一些業(yè)務(wù)無關(guān)瑣碎的事務(wù)代碼分離開來。讓開發(fā)者只關(guān)心業(yè)務(wù)邏輯部分,不用關(guān)系類似于數(shù)據(jù)庫事務(wù)管理、日志管理等瑣碎的事務(wù)。

??SpringAOP建立在Java的反射基礎(chǔ)之上,將分布在程序中的公共部分提取出來,做成了切面類(比如數(shù)據(jù)庫事務(wù))這樣做的好處在于代碼的可重用。一旦涉及到該功能的需求發(fā)生變化,只要修改該代碼就行。
從生活中可以很容易舉出例子,比如一個(gè)開發(fā)者A想把大象塞進(jìn)冰箱,那么他就要:

  • 打開冰箱
  • 塞進(jìn)大象
  • 關(guān)掉冰箱

??如果此時(shí)有開發(fā)者B想塞阿貓,開發(fā)者C想塞阿狗,那么他們都需要做的公共部分就是打開冰箱和關(guān)掉冰箱。那么現(xiàn)在要求,每次打開冰箱的時(shí)候都需要在日志上寫上打開冰箱時(shí)間,這個(gè)時(shí)候就發(fā)現(xiàn)每個(gè)開發(fā)者都要加一個(gè)寫上時(shí)間的步驟。在企業(yè)開發(fā)中,如果有成百上千個(gè)開發(fā)者,那么維護(hù)成本就會很高。
SpringAOP是怎么做的呢?
??Spring把打開冰箱和關(guān)掉冰箱這兩個(gè)動(dòng)作提取出來做成一個(gè)切面類,找到切點(diǎn)(切點(diǎn)就是塞這個(gè)動(dòng)作),然后織入(織入就是生成代理對象的過程)。下次開發(fā)者A去想要塞大象的時(shí),Spring就會把冰箱打開好,開發(fā)者A塞進(jìn)大象,Spring再來把冰箱關(guān)閉。開發(fā)者A現(xiàn)在只需要關(guān)注自己要干什么,而不必關(guān)心打開冰箱和關(guān)掉冰箱了。如果要求在每個(gè)開發(fā)者打開冰箱前在日志上寫下打開時(shí)間,那么也只需要改一下切面類中的代碼。
??打開冰箱和關(guān)掉冰箱就相當(dāng)于企業(yè)項(xiàng)目中的數(shù)據(jù)庫事務(wù),而塞大象就相當(dāng)于業(yè)務(wù)邏輯代碼。

AOP的實(shí)現(xiàn)


??AOP有多種實(shí)現(xiàn),最常使用的就是Spring AOP和AspectJ,Spring只是使用了與AspectJ5一樣的注解,但仍然沒有使用AspectJ的編譯器,底層是動(dòng)態(tài)代理技術(shù)的實(shí)現(xiàn),并不依賴于AspectJ的編譯器。
??織入就是一個(gè)生成代理對象的過程,一般分為動(dòng)態(tài)織入和靜態(tài)織入,動(dòng)態(tài)織入的方式是在運(yùn)行時(shí)動(dòng)態(tài)將要增強(qiáng)的代碼織入到目標(biāo)類中,這樣往往是通過動(dòng)態(tài)代理技術(shù)完成的,靜態(tài)織入是指在編譯時(shí)期就織入,即:編譯出來的class文件,字節(jié)碼就已經(jīng)被織入了。

SpringAOP是采用動(dòng)態(tài)織入

有兩種實(shí)現(xiàn)方式

  • 基于接口的動(dòng)態(tài)代理(Dynamic Proxy)
  • 基于繼承的CGLIB代理

AspectJ是采用靜態(tài)織入

??使用AspectJ的acj編譯器(類似javac)把a(bǔ)spect類編譯成class字節(jié)碼后,在java目標(biāo)類編譯時(shí)織入,即先編譯aspect類再編譯目標(biāo)類。

轉(zhuǎn)載于:https://www.cnblogs.com/keeya/p/9227724.html

總結(jié)

以上是生活随笔為你收集整理的Spring的IoC与AOP的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。