spring的aop實(shí)現(xiàn)原理是什么

小億
88
2023-11-22 10:18:46

Spring的AOP(Aspect-Oriented Programming,面向切面編程)實(shí)現(xiàn)原理是基于動(dòng)態(tài)代理。在Spring中,AOP通過(guò)代理對(duì)象來(lái)實(shí)現(xiàn)橫切關(guān)注點(diǎn)的功能。

在AOP中,關(guān)注點(diǎn)是指程序中的某個(gè)具體功能模塊,例如日志記錄、事務(wù)管理等。橫切關(guān)注點(diǎn)是指這些功能模塊存在于整個(gè)應(yīng)用程序中,并且與業(yè)務(wù)邏輯存在交叉關(guān)系,無(wú)法單獨(dú)劃分為一個(gè)獨(dú)立的模塊。

Spring AOP采用代理模式來(lái)實(shí)現(xiàn)橫切關(guān)注點(diǎn)的功能。具體來(lái)說(shuō),Spring AOP使用兩種類(lèi)型的代理:JDK動(dòng)態(tài)代理和CGLIB代理。

JDK動(dòng)態(tài)代理:如果被代理的目標(biāo)對(duì)象實(shí)現(xiàn)了接口,則Spring AOP將使用JDK動(dòng)態(tài)代理來(lái)生成代理對(duì)象。JDK動(dòng)態(tài)代理基于接口的代理,它通過(guò)在運(yùn)行時(shí)生成一個(gè)實(shí)現(xiàn)了目標(biāo)對(duì)象接口的代理類(lèi),并將目標(biāo)對(duì)象的方法調(diào)用委托給這個(gè)代理類(lèi)來(lái)實(shí)現(xiàn)橫切邏輯。

CGLIB代理:如果被代理的目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口,則Spring AOP將使用CGLIB代理來(lái)生成代理對(duì)象。CGLIB代理是通過(guò)繼承目標(biāo)對(duì)象生成的子類(lèi)來(lái)實(shí)現(xiàn)的,子類(lèi)重寫(xiě)了目標(biāo)對(duì)象的方法,并在重寫(xiě)的方法中添加橫切邏輯。

在Spring AOP中,切面(Aspect)是橫切關(guān)注點(diǎn)的模塊化表達(dá)方式。切面由切點(diǎn)(Pointcut)和通知(Advice)組成。

切點(diǎn)是程序中匹配橫切關(guān)注點(diǎn)的定義,通常使用表達(dá)式語(yǔ)言來(lái)定義。切點(diǎn)可以指定在哪些類(lèi)的哪些方法上應(yīng)用通知。

通知是切面定義的具體橫切邏輯,例如在目標(biāo)方法調(diào)用前執(zhí)行的邏輯(前置通知)、在目標(biāo)方法調(diào)用后執(zhí)行的邏輯(后置通知)、在目標(biāo)方法拋出異常時(shí)執(zhí)行的邏輯(異常通知)等。

Spring AOP會(huì)在目標(biāo)對(duì)象的方法被調(diào)用時(shí),根據(jù)切點(diǎn)匹配的規(guī)則,動(dòng)態(tài)地在目標(biāo)方法調(diào)用前、調(diào)用后、拋出異常時(shí)等時(shí)機(jī)執(zhí)行相應(yīng)的通知邏輯。這種動(dòng)態(tài)的代理機(jī)制,使得開(kāi)發(fā)者能夠在不修改源代碼的情況下,通過(guò)配置切面來(lái)實(shí)現(xiàn)橫切關(guān)注點(diǎn)的功能。

0