更新時(shí)間:2022-12-15 16:37:18 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1640次
AOP是一種編程思想,是通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理的方式實(shí)現(xiàn)不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的技術(shù)。面向?qū)ο缶幊虒⒊绦虺橄蟪筛鱾€(gè)層次的對象,而面向切面編程是將程序抽象成各個(gè)切面。所謂切面,相當(dāng)于應(yīng)用對象間的橫切點(diǎn),我們可以將其單獨(dú)抽象為單獨(dú)的模塊。

AOP技術(shù)利用一種稱為“橫切”的技術(shù),剖解開封裝對象的內(nèi)部,將影響多個(gè)類的公共行為封裝到一個(gè)可重用的模塊中,并將其命名為切面。所謂的切面,簡單來說就是與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯,將其封裝起來便于減少系統(tǒng)的重復(fù)代碼,降低模塊的耦合度,有利用未來的可操作性和可維護(hù)性。
利用AOP可以對業(yè)務(wù)邏輯各個(gè)部分進(jìn)行隔離,從而使業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高開發(fā)效率。
AOP可以有多種實(shí)現(xiàn)方式,而Spring AOP支持如下兩種實(shí)現(xiàn)方式。
JDK動(dòng)態(tài)代理:這是Java提供的動(dòng)態(tài)代理技術(shù),可以在運(yùn)行時(shí)創(chuàng)建接口的代理實(shí)例。Spring AOP默認(rèn)采用這種方式,在接口的代理實(shí)例中織入代碼。
CGLib動(dòng)態(tài)代理:采用底層的字節(jié)碼技術(shù),在運(yùn)行時(shí)創(chuàng)建子類代理的實(shí)例。當(dāng)目標(biāo)對象不存在接口時(shí),Spring AOP就會(huì)采用這種方式,在子類實(shí)例中織入代碼。加分回答 在應(yīng)用場景方面,Spring AOP為IoC的使用提供了更多的便利,一方面,應(yīng)用可以直接使用AOP的功能,設(shè)計(jì)應(yīng)用的橫切關(guān)注點(diǎn),把跨越應(yīng)用程序多個(gè)模塊的功能抽象出來,并通過簡單的AOP的使用,靈活地編制到模塊中,比如可以通過AOP實(shí)現(xiàn)應(yīng)用程序中的日志功能。
另一方面,在Spring內(nèi)部,例如事務(wù)處理之類的一些支持模塊也是通過Spring AOP來實(shí)現(xiàn)的。
AOP不能增強(qiáng)的類:1. Spring AOP只能對IoC容器中的Bean進(jìn)行增強(qiáng),對于不受容器管理的對象不能增強(qiáng)。2. 由于CGLib采用動(dòng)態(tài)創(chuàng)建子類的方式生成代理對象,所以不能對final修飾的類進(jìn)行代理。
以上就是“aop面試題:你對AOP有這什么樣的解讀呢”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀

初級 202925

初級 203221

初級 202629

初級 203743