您好,登錄后才能下訂單哦!
和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,例如:
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 }
現(xiàn)在我們將對(duì)象的控制權(quán)“反轉(zhuǎn)”,交由第三方容器進(jìn)行管理,即交由Spring容器幫我們管理,使得我們不再People代碼中與Eat對(duì)象緊耦合。在看下面的代碼:
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 }
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ě)。
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 }
“單一職責(zé)”告訴我們,這樣寫(xiě)到底好不好呢?日志記錄是People該做的事嗎?難道它不應(yīng)該只負(fù)責(zé)插入數(shù)據(jù)的操作嗎?正確的做法應(yīng)該是這么的在People類中只有這幾句代碼:
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 }
那我們?cè)趺丛趇nsert方法中先記錄日志呢?我們可以用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn),即創(chuàng)建一個(gè)代理類的對(duì)象實(shí)例,Spring也已經(jīng)為我們做好了這件事,僅僅需要配置一下幾句話,即可實(shí)現(xiàn)。
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>
事實(shí)上我們能實(shí)現(xiàn)最開(kāi)始我們“糟糕”代碼的功能了,而且更優(yōu)美。在這里我們僅僅對(duì)IoC和AOP做一個(gè)簡(jiǎn)單的了解,在后面會(huì)和MyBatis一樣,先學(xué)會(huì)從第一步配置,再學(xué)會(huì)怎么用,最后再來(lái)了解框架源代碼原理等等。
免責(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)容。