溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring入門導(dǎo)讀——IoC和AOP

發(fā)布時(shí)間:2020-07-13 07:12:33 來(lái)源:網(wǎng)絡(luò) 閱讀:313 作者:zsdnr 欄目:網(wǎng)絡(luò)安全

和MyBatis系列不同的是,在正式開(kāi)始Spring入門時(shí),我們先來(lái)了解兩個(gè)關(guān)于Spring核心的概念,IoC(Inverse of Control)控制反轉(zhuǎn)和AOP()面向切面編程。

1.IoC(Inversion of Control)控制反轉(zhuǎn)

什么是控制反轉(zhuǎn)呢?可以這么通俗的來(lái)解釋,我們通常寫(xiě)代碼當(dāng)一個(gè)類會(huì)關(guān)聯(lián)另一個(gè)類是會(huì)直接在這個(gè)類里new,例如:

Spring入門導(dǎo)讀——IoC和AOP

 1 package day_30_spring; 2  3 /** 4  * @author 余林豐 5  * 6  * 2016年10月30日 7  */ 8 public class People { 9     private Eat eat;10     11     /**12      * 在構(gòu)造方法中創(chuàng)建Eat的對(duì)象實(shí)例13      */14     public People(){15         eat = new Eat();16     }17     18 }

Spring入門導(dǎo)讀——IoC和AOP

現(xiàn)在我們將對(duì)象的控制權(quán)“反轉(zhuǎn)”,交由第三方容器進(jìn)行管理,即交由Spring容器幫我們管理,使得我們不再People代碼中與Eat對(duì)象緊耦合。在看下面的代碼:

Spring入門導(dǎo)讀——IoC和AOP

 1 package day_30_spring; 2  3 /** 4  * @author 余林豐 5  * 6  * 2016年10月30日 7  */ 8 public class People { 9     private Action eat;10     11     /**12      * 在構(gòu)造方法中創(chuàng)建Eat的對(duì)象實(shí)例13      */14     public People(Action eat){15         this.eat = eat;16     }17     18 }

Spring入門導(dǎo)讀——IoC和AOP

Eat類是繼承至Action接口的,這實(shí)際上就是通過(guò)依賴注入(DI,Dependency Inversion)的方式來(lái)實(shí)現(xiàn)控制反轉(zhuǎn)。通過(guò)構(gòu)造方法來(lái)注入。不依賴于具體的Action接口實(shí)現(xiàn),我們只需要傳遞一個(gè)Action接口類進(jìn)去即可。相比于之前的“傳統(tǒng)”代碼緊緊的依賴Action的具體實(shí)現(xiàn)Eat類,這個(gè)代碼實(shí)際上解了代碼的耦合性。Spring有兩種構(gòu)造方式,一種就是我們上面說(shuō)到的構(gòu)造器注入,另一種就是set方法注入。所以,IoC的很簡(jiǎn)單,目的是解耦,手段是通過(guò)依賴注入。Spring容器幫我們解決了一切。

2.AOP(Aspect Oriented Programming)面向切面編程

那什么又是面向切面編程呢?如果你有了解過(guò)代理模式,那么就對(duì)AOP比較容易理解了,AOP的原理實(shí)際上也是通過(guò)動(dòng)態(tài)代理的方式實(shí)現(xiàn)的。我們來(lái)看下面這個(gè)例子:對(duì)數(shù)據(jù)庫(kù)的操作前會(huì)有日志記錄,對(duì)數(shù)據(jù)庫(kù)的操作完后也會(huì)有日志記錄,“通?!蔽覀兛赡軙?huì)這么寫(xiě)。

Spring入門導(dǎo)讀——IoC和AOP

 1 package day_30_spring; 2  3 /** 4  * @author 余林豐 5  * 6  * 2016年10月30日 7  */ 8 public class People { 9     private Logger logger = new Logger();10     11     public void insert(int i){12         logger.beforeInsert();    //插入前的日志記錄13         //此處插入一條數(shù)據(jù)14         logger.afterInsert();    //插入后的日志記錄15     }16 }

Spring入門導(dǎo)讀——IoC和AOP

“單一職責(zé)”告訴我們,這樣寫(xiě)到底好不好呢?日志記錄是People該做的事嗎?難道它不應(yīng)該只負(fù)責(zé)插入數(shù)據(jù)的操作嗎?正確的做法應(yīng)該是這么的在People類中只有這幾句代碼:

Spring入門導(dǎo)讀——IoC和AOP

 1 package day_30_spring; 2  3 /** 4  * @author 余林豐 5  * 6  * 2016年10月30日 7  */ 8 public class People { 9     10     public void insert(int i){11         //此處插入一條數(shù)據(jù)12     }13 }

Spring入門導(dǎo)讀——IoC和AOP

那我們?cè)趺丛趇nsert方法中先記錄日志呢?我們可以用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn),即創(chuàng)建一個(gè)代理類的對(duì)象實(shí)例,Spring也已經(jīng)為我們做好了這件事,僅僅需要配置一下幾句話,即可實(shí)現(xiàn)。

Spring入門導(dǎo)讀——IoC和AOP

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans> 3     <!-- 省略其他配置,只配置aop --> 4     <aop:config> 5         <aop:aspect ref="logger"> 6             <aop:pointcut id="insert" expression="execution(* *.insert(..))"/> 7             <aop:befor point-ref="insert" method="beforeInsert"/> 8             <aop:after point-ref="insert" method="afterInsert"/> 9         </aop:aspect>10     </aop:config>11 </beans>

Spring入門導(dǎo)讀——IoC和AOP

事實(shí)上我們能實(shí)現(xiàn)最開(kāi)始我們“糟糕”代碼的功能了,而且更優(yōu)美。在這里我們僅僅對(duì)IoC和AOP做一個(gè)簡(jiǎn)單的了解,在后面會(huì)和MyBatis一樣,先學(xué)會(huì)從第一步配置,再學(xué)會(huì)怎么用,最后再來(lái)了解框架源代碼原理等等。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI