Java三十九篇:回顧Spring(2)
SpringAOP
AOP:A是Aspect,表示切面。AOP就是面向切面編程的意思。
在業(yè)務(wù)層中為了對(duì)事務(wù)進(jìn)行管理,通常會(huì)有如下的代碼模板,而且是每一個(gè)業(yè)務(wù)層方法都需要執(zhí)行如下的步驟。
這樣出來(lái)的代碼冗余程度高(可維護(hù)性差)。處理代碼冗余問題最常規(guī)的思路就是將公共代碼提取出來(lái),大家一起使用。

那么我們現(xiàn)在將公共模塊抽取出來(lái)。
將事務(wù)管理的公共部分抽取出來(lái)成為一個(gè)類。
該類中具備4個(gè)方法:
代碼拆分之后如何合在一起是一個(gè)問題,我們可以使用代理模式來(lái)完成這個(gè)過程。
代理模式:
代理模式中有兩個(gè)角色:代理對(duì)象和目標(biāo)對(duì)象(原對(duì)象)
代理對(duì)象通過持有目標(biāo)對(duì)象,對(duì)目標(biāo)對(duì)象的方法進(jìn)行增強(qiáng)處理。
動(dòng)態(tài)代理:由JAVA或者第三方的程序,代替我們來(lái)完成代理對(duì)象的創(chuàng)建過程。
動(dòng)態(tài)代理有兩種JDK動(dòng)態(tài)代理和CGLIB的動(dòng)態(tài)代理
以JDK動(dòng)態(tài)代理為例:
1.我們需要將代理中需要執(zhí)行的代碼(事務(wù)管理的這一部分代碼)封裝起來(lái)。
2.調(diào)用動(dòng)態(tài)代理的API創(chuàng)建動(dòng)態(tài)代理對(duì)象
3.通過創(chuàng)建出來(lái)的代理對(duì)象執(zhí)行方法
在調(diào)用動(dòng)態(tài)代理的方法時(shí),根據(jù)源碼分析可以得知執(zhí)行的是傳入的InvocationHandler中的invoke方法。執(zhí)行Invoke方法時(shí)傳入了正在執(zhí)行的這個(gè)transfer方法對(duì)象,同時(shí)還有執(zhí)行該方法的參數(shù)。在InvocationHandler的invoke方法中封裝事務(wù)管理的代碼,然后通過反射執(zhí)行目標(biāo)對(duì)象的transfer方法。

代理模式總結(jié):
動(dòng)態(tài)代理共兩種:JDK?? ?CGLIB
JDK只能代理實(shí)現(xiàn)了接口的類,CGLIB都可以
JDK代理對(duì)象是目標(biāo)對(duì)象的兄弟,他們實(shí)現(xiàn)了同一個(gè)接口。CGLIB代理對(duì)象是目標(biāo)對(duì)象的子類。
我們?cè)谏厦娴陌咐惺褂脛?dòng)態(tài)代理完成了統(tǒng)一的事務(wù)管理。那這種解決問題的方式就是面向切面的雛形。
面向切面編程編程的重要概念:
面向切面:將代碼以橫向的形式切入到某些方法中。
advice:通知,封裝公共部分代碼的類。根據(jù)切入位置的不同通知一共可分為5種。
前置增強(qiáng)、后置增強(qiáng)、異常增強(qiáng)、最終增強(qiáng)、環(huán)繞增強(qiáng)
join point:連接點(diǎn),進(jìn)行代碼切入的某一個(gè)具體的方法。
point cut:切入點(diǎn),描述所有連接點(diǎn)集合的一種規(guī)則。
通知代表了要切入的內(nèi)容,切入點(diǎn)代表要切入的方法。
aspect:切面,切入點(diǎn)和通知構(gòu)成一個(gè)切面。
weave :織入(編織),在判定目標(biāo)對(duì)象處于切入點(diǎn)之上時(shí),通過代理對(duì)象的方式將通知和目標(biāo)對(duì)象編制在一起成為代理對(duì)象的過程。
SpringAOP就是建立在AOP思想之上的一套框架程序。我們可以通過配置或者注解將切入點(diǎn)信息和通知信息全部告知給Spring,Spring的IOC在創(chuàng)建對(duì)象時(shí)如果發(fā)現(xiàn)該對(duì)象處于切入點(diǎn)之上的,就會(huì)采用動(dòng)態(tài)代理的方式來(lái)創(chuàng)建這個(gè)對(duì)象并且將通知代碼織入進(jìn)去。
下一篇:回顧Spring整合mybatis
? ? ? ? ? ? ? ? ?
